2013-04-25 1 views
0

У меня возникла проблема с динамическим созданием «многомерного массива». Я прочитал 6.14 в разделе вопросов, связанных с comp.lang.c, и следую коду, который там был указан.Ошибка сегментации при использовании malloc для создания массива указателей на указатели

  cache_array = malloc(cm_blks * sizeof(int *)); 
      if (cache_array = NULL) { 
        fprintf(stderr, "out of memory\n"); 
        exit(1); 
      } 

      for (i = 0; i < cm_blks; i++) { 
        cache_array[i] = malloc(6 * sizeof(int)); 
        if (cache_array[i] == NULL) { 
          fprintf(stderr, "out of memory\n"); 
          exit(1); 

        } 
      } 

переменной cm_blks представляет собой целое число, в моем тестовом случае равен 8. cache_array инициализируются как:

int **cache_array; 

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

ответ

3

Это не проверка равенства, но является назначения:

if (cache_array = NULL) 

который устанавливает cache_array в NULL и не входит в if ветви, как результат выполнения задания, по сути, неверно. Затем код продолжает разыменовывать указатель NULL.

Изменить на:

if (cache_array == NULL) 

или:

if (!cache_array) 
+4

Хороший улов. Это кажется странным для многих людей, но часто бывает полезно разместить константы перед переменными в условных тестах ... например: 'if (NULL = cache_array)' поймал бы ошибку как попытку присвоить переменную переменной постоянная. Это удобный способ избежать таких тонких ошибок. –

+0

Вау, я полностью пропустил это! Большое спасибо за вторую пару глаз! – user2321508