2015-05-09 57 views
0

我有一个头文件,其中包含char** globalScreen,我已经分配了内存中的函数,该函数一旦程序在main.c中启动就会被调用。Segfault的问题可能涉及范围

我按照以下方式分配了内存;

char (*globalScreen)[SSIZEY] = malloc(SSIZEX * SSIZEY * sizeof(char*)); 

    int i,j; 
    for(i = 0;i < SSIZEX;i++) 
    { 
     for(j = 0; j < SSIZEY;j++) 
     { 
      globalScreen[i][j] = (char)0x41; 
     } 
    } 

还初始化了数组。

然后我可以成功打印整个数组,但只能从我分配并初始化它的函数内部。当我尝试从main访问数组时 - 在调用初始化数组的函数之后,程序段错误。

我试过用lldb调试,但发现它似乎无法找到我试图设置它们的任何位置。 头文件的相关部分如下;

 #ifndef _VECTORDATA_H_ 
      #define _VECTORDATA_H_ 
     #include "vectorAPI.h" 

     char** globalScreen; 
     #endif 
+0

你可以发布头文件中的相关部分吗? –

+0

你还可以发布初始化数组的整个函数吗? –

+2

重命名char ** globalScreen; char ** globalScreenXXX;并尝试编译..我认为他们是不同的变量之一,其中一个是本地的,另一个是全局的。 – houssam

回答

3

我假设你的初始化函数是这样的:

void initialize() 
{ 
    char (*globalScreen)[SSIZEY] = malloc(SSIZEX * SSIZEY * sizeof(char*)); 
    // rest of code 
} 

这意味着它宣称的不是给出值的全局变量命名globalScreen新变量。

此外,如果未将其声明为没有转换的2D数组,则无法访问globalScreen。此外,如果您只需要一个2D数组,则使用指针指针char **而不是单个指针char *是多余的。

试试这个代码,而不是:

char * globalScreen; 

void initialize() 
{ 
    globalScreen = (char *) malloc(SSIZEX * SSIZEY * sizeof(char*)); 

    char (*tmp)[SSIZEY] = globalScreen; 

    int i,j; 
    for(i = 0;i < SSIZEX;i++) 
    { 
     for(j = 0; j < SSIZEY;j++) 
     { 
      tmp[i][j] = (char)0x41; 
     } 
    } 
} 

要访问globalScreen作为一个二维数组每一次,你必须投它。

否则,您可以在开始时将其定义为数组,并且根本不需要内存分配。