2015-05-09 2 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

rename char ** globalScreen; to char ** globalScreenXXX; и пытаюсь скомпилировать .. Я думаю, что они разные переменные, один из которых локальный, а другой глобальный. – houssam

ответ

3

Я предполагаю, что ваша функция инициализации что-то вроде этого:

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

Это означает, что он объявляет новую переменную с именем globalScreen, вместо того чтобы дать значение глобальной переменной.

Кроме того, вы не можете получить доступ к globalScreen как к двумерному массиву, если он не был объявлен как один без приведения. Более того, избыточно использовать указатель-указатель char ** вместо одного указателя char *, если вам нужен только 2D-массив.

Попробуйте этот код вместо:

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 как 2D массив, вы должны бросить его.

В противном случае вы можете определить его как массив в начале, и вам вообще не требуется выделение памяти.

Смежные вопросы