2015-10-30 4 views
0

В моей программе мне нужно создать связанный список, но размер списка (количество узлов) определяется во время компиляции. «newcustomer.numT» - это количество узлов, которые будут созданы. Чтобы сделать это, я подумал, что у меня должен быть массив указателей, тогда я бы запросил память из кучи каждым указателем. НО, к сожалению, я также не знаю размер массива. Я создал его динамически. «transactionn» - это структура, которая содержит значения в одном узле.Критическая ошибка, обнаруженная при распределении с кучи

transactionn **asd; 
asd = new transactionn*[newcustomer.numT]; //I created array of pointers 
for (int k = 0; k<newcustomer.numT; k++){ 
    asd[k] = new transactionn; //Allocating a node for each pointer in the array 
} //End of the "node creating" 

newcustomer.trahead = asd[0]; //Assign head to the first node 

//Connecting nodes in the linked list to eachother 
for (int z = 0; z < (newcustomer.numT)-1; z++){ 
    asd[z]->next = asd[z + 1];  
} 
asd[newcustomer.numT]->next = NULL; //Set the next of the last node to NULL 

Когда я скомпилировать его, нет никакой ошибки в списке ошибок, но на выходе я получаю это:

Critical error detected c0000374 
DataHomework2.exe has triggered a breakpoint. 

И это вызывает точку останова в этой строке:

asd[k] = new transactionn; 

Что я делаю неправильно?

Edit: я исправил последний индекс, когда так:

asd[(newcustomer.numT)-1]->next = NULL; 

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

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

+1

Это означает «Куча повреждена». Стандартная ошибка, когда вы бросаете необработанные указатели, ошибка находится в другом месте. –

+0

Так нет ли ошибки в этих строках? @HansPassant –

ответ

3
asd = new transactionn*[newcustomer.numT]; //I created array of pointers 
//... 
asd[newcustomer.numT]->next = NULL; //Set the next of the last node to NULL 

Вы переполняете массив. Последний индекс массива, на который указывает asd, равен newcustomer.numT - 1.

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