2013-04-24 6 views
0

Я пытаюсь назначить программирование на C, где мне нужно перебирать каждый индекс каждой строки документа и устанавливать целочисленное значение в каждом символьном индексе в соответствующем массиве ar:malloc() возвращает нулевой указатель

//Jagged array ar containing pointers to each row 
int* ar[line_count]; 
//The size of each row is the line width * the size of an int ptr 
const int line_size = max_width * sizeof(int*); 

//For each line 
for (i = 0; i < line_count; i++) 
{ 
    //If the first runthrough, copy the blank array 
    if (i == 0) 
    { 
     ar[i] = malloc(line_size); 
     memcpy(ar[i], blank_ar, line_size); 
    } 
    //Otherwise, copy from the last row 
    else 
    { 
     ar[i] = malloc(line_size); 
     //This is set to a null pointer after several runthroughs 
     memcpy(ar[i], ar[i - 1], line_size); 
    } 
    //Edit the current row ar[i] 
} 

Единственная проблема заключается в том, что после примерно девяти итераций malloc начинает возвращать нулевой указатель, который заставляет memcpy (очевидно) не работать.

Есть ли причина, по которой это происходит? У меня не хватает памяти, поскольку я распределяю эти крошечные массивы 9 раз.

+1

Что говорит ваш отладчик? Любые 0-значения между ними? –

+0

Между чем? – Miguel

+0

Что вы назначили как значение max_width? Проверьте какие-то тривиальные ошибки, которые вы совершили. –

ответ

6

malloc вернет нулевой указатель при его отсутствии. Некоторые очевидные причины, почему это может произойти:

  • Вы исчерпали память кучи. Это правдоподобно, если line_size очень большой.
  • Вы испортили кучу. Это может произойти, если есть ошибки в коде, который вы используете, но удалены с целью задать этот вопрос.

Ознакомиться со значением errno, чтобы узнать больше о неисправности.

+0

Как это сделать? Это часть stderr? – Miguel

+2

Используйте 'strerror()' для получения текстового представления ошибки, представленной 'errno'. Или просто вызвать 'perror()' для печати на консоль. Например: 'perror (« malloc failed »);' –

+0

. Хорошо, я сделал это, и он вернул «malloc failed: недостаточно места». Проблема в том, что если я приостанавливаю приложение непосредственно перед его сбоем, я использую только 484 КБ памяти и оставлю сотни мб памяти, согласно диспетчеру задач. Eclipse также говорит, что он разбился из-за ошибки сегментации. – Miguel

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