2015-04-09 2 views
-1

У меня есть очень простой фрагмент ниже, для которого я пытаюсь выяснить причину возникновения ошибки сегментации.C - 2D Array malloc/free - Ошибка сегментации

int main (int argc, char** argv) 
{ 
    const int size = 2; 
    char** test1 = NULL; 
    int index = 0; 

    test1=(char**)malloc(sizeof(char*) * size); 
    if (test1 != NULL) 
    { 
      for (index = 0; index < size ; index++) 
      { 
        test1[index]=(char*)malloc(sizeof(char)); 
        test1[index]='a'; 
      } 

      //Removing this block does not result in seg fault - start 
      for (index = 0 ; index < size ; index++) 
      { 
        free(test1[index]); //Seg. fault here 
      } 
      //Removing this block does not result in seg fault - end 

      free(test1); 
    } 
    return 0; 
} 

Если я удалю блок, заключенный в комментарии о начале и конце, я не вижу ошибки seg. Но я думаю, что это приведет к утечке.

Любая помощь очень ценится.

+3

Вы назначая ' 'a'' переменного вы объявили как указатель charaacter. другими словами, 'test [index] = 'a'' заменяет указатель, который был выделен из кучи символом' 'a''. Затем вы пытаетесь освободить '' a'' (поскольку это значение 'test [index]' in 'free (test [index])'), как если бы это был выделенный указатель. Это проблема. Я предполагаю, что вы действительно имели в виду, '* test [index] = 'a''. – lurker

+0

или 'char * test1 = (char *) malloc (sizeof (char) * size);' .. 'test1 [index] = 'a';' .. 'free (test1);' – BLUEPIXY

+0

Jeez ... that была проблема - shold были * test1 [index]. Большое спасибо BLUEPIXY – user3667029

ответ

0

Я думаю, вы хотели разыграть test1 [index]. Ваш код перезаписывает адрес выделенной памяти с помощью «a», поэтому, когда он пытается освободить память, он перехватывает ошибку, потому что «a» не является допустимым адресом.

test1[index]=(char*)malloc(sizeof(char)); 
*test1[index]='a'; 

Это работает хорошо

test1[index][0]='a'; 
0

Вы начинаете хорошо:

test1=(char**)malloc(sizeof(char*) * size); 
    if (test1 != NULL) { 

Ваш цикл не является:

 for (index = 0; index < size ; index++) { 
       test1[index]=(char*)malloc(sizeof(char)); 
       test1[index]='a'; 
     } 

Во-первых, выделение только один байт то, что должно быть рядом символов (si Если у вас есть только одна переменная размера, я предполагаю, что вы хотите, чтобы ваш 2d-массив был квадратным: 2x2. Поэтому вам нужно размножаться по размеру, как и во внешнем цикле. Вам не нужен «sizeof (char)», это всего лишь длинный способ ввода «1».

Но хуже этого, после выделения слишком короткой строки, вы затем отбрасываете эту память, перезаписывая указатель символом (вы должны были получить предупреждение о компиляторе здесь). Это катастрофа, ожидающая случившегося, и утечка памяти.

То, что вы на самом деле имеете в виду:

 for (index = 0; index < size ; index++) { 
       test1[index]=malloc(size); 
       test1[index][0]='a'; 
     } 
Смежные вопросы