2014-11-12 6 views
-1

Может ли кто-нибудь помочь с этим (я предполагаю, что проблема с указателем и распределением памяти - во время выполнения код не работает, если я удаляю //COMMENTED// cout statement. Два файла *in и *out структуры данных структуры E, хотя обрабатываются таким же образом, только * в дает мне результат, как желаемомC++ Указатели связывания в реализации связанных списков

struct V 
{ 
     int al; 
     V *next; 
}; 

struct E 
{; 
     int id; 
     V *in; 
     V *out; 
}; 

void init(E *edges, int count) 
{ 
    int i = 0; 

    int id = 1; 
    while (i < count) 
    { 
     edges[i].id = id; 
     edges[i].out = new V; 
     edges[i].out->al = 0; 
     edges[i].out->next = NULL; 
     edges[i].in = new V; 
     edges[i].in->al = 0; 
     edges[i].in->next = NULL; 
     i++; id++; 
    } 
    i =0; 
    while (i < count) 
    { 
     cout<<"Edges are:"<<endl; 
     cout<<"Edge In "<<i<<" is "<<edges[i].in->al<<endl; 
     //cout<<"Edge Out "<<i<<" is "<<edges[i].out->al<<endl; 
     i++; 
    } 
} 

int main() 
{ 
     int counter=5; 
     E *edges = new E[counter]; 
     init(edges,counter); 
} 
+1

Прекратите кричать, добавьте правильный отступ и используйте блок кода вместо фрагмента стека (для HTML + CSS + JS)! Вы можете его отредактировать. – Deduplicator

ответ

1

Смотрите эту строку

edges[i].id = ++i; 

Вы изменяете i, но затем продолжать использовать его для последующего состояния Менты. Это оставит некоторые из ваших элементов неинициализированными, а другие попытаются написать вне границ вашего массива.

Редактировать: Как указывает дедупликатор, это неопределенное поведение (UB) еще до того, как оно дойдет до следующего оператора. Вы не можете рассчитывать, на каком порядке оцениваются левая и правая стороны оператора присваивания, поэтому (например) i++ может произойти до части edges[i]. У этого question есть некоторые информативные ответы.

+0

Неправильно. Это намного хуже: UB уже там. – Deduplicator

+0

Как так? Если вы имеете в виду, потому что 'i' изменяется до того, как он используется в этом утверждении, почему бы не сказать так? Если вы имеете в виду что-то еще, почему бы не сказать это? Edit: Ах, я вижу, вы добавили «UB» к вашему комментарию, неважно. –

+0

Утверждение UB, даже если оно выполнено с i == 0, а ребра - как минимум 2 элемента. – Deduplicator

1

Эта строка имеет ошибку: edges[i].id = ++i; Здесь элемент массива в индексе 1 получает назначенный вместо целевого элемента индекс 0. Измените его на что-то вроде: edges[i].id = i+1; и приращение i в конце цикла while.

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