2015-05-09 78 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作爲一個二維數組每一次,你必須投它。

否則,您可以在開始時將其定義爲數組,並且根本不需要內存分配。