2016-05-24 2 views
2

Кто-нибудь знает, почему член Node_ptr next; делает элементы массива poly[1] и poly[2] отображает неправильное значение? Если удалить Node_ptr next; из структуры (struct node), я могу получить правильное значение для индексов 1 и 2.Структура отображения массива неправильных значений

Вот мой код:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct node *Node_ptr; 
struct node { 
    int coef; 
    int exp; 
    Node_ptr next; 
    }; 

int main() 
{ 
    struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; 
    struct node p2_terms[] = {3, 1990, 2, 1492, 11, 5}; 

    struct node poly[20]; 
    poly[0] = p1_terms[0]; 

    poly[1] = p1_terms[1]; 

    poly[2] = p1_terms[2]; 

    printf("Your polynomials are: \n%dx^%d+%dx^%d+%dx^%d", poly[0].coef, poly[0].exp, poly[1].coef, poly[1].exp, poly[2].coef, poly[2].exp); 

    int siz = sizeof(poly); 
    printf("\n\nSize of the array: %d bytes \n",siz); 
    return 0; 
} 
+3

'{10, 1000, 5, 14, 1, 0};' неправильный список инициализаторов. -> '{{10, 1000}, {5, 14}, {1, 0}}' – BLUEPIXY

ответ

8

Цитирование C11, глава §6.7. 9, (курсив мой )

Каждая скобка-прилагаемом списке инициализатора имеет связанный с ним текущий объект. Если нет обозначений, подобъекты текущего объекта инициализируются в порядке типу текущего объекта: элементы массива в возрастающем порядке подстроки, структура членов в порядке декларации и первый именованный член союза. [...]

Так, в основном, в инициализации

struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; 

размер массива равен 2. Это создает два элемента struct node, таким образом, доступ к p1_terms[2] вне связанного доступа, призывающее undefined behavior.

Тем не менее, инициализации инициализирует элементы структуры для того, что средства, для вышеприведенного случая, значения членов будет как

p1_terms[0].coef = 10; 
p1_terms[0].exp= 1000; 
p1_terms[0].next= 5; // see here.... 

и это, конечно, не , что вы хотите. Вы должны использовать список инициализатора как

struct node p1_terms[] = {{10, 1000}, {5, 14}, {1, 0}}; 

избежать next получения инициализации.

Связанные с той же главы

Если совокупность или объединение содержит элементы или элементы, которые являются агрегаты или союзы, эти правила применяются рекурсивно к subaggregates или содержали союзы. Если инициализатор субагрегат или содержащий объединение начинается с левой скобки, инициализаторы, заключенные в , которые скобки и соответствующие им правильные фигурные скобки инициализируют элементы или элементы субагрегата или объединенного объединения. [...]

+0

Спасибо за быстрый ответ. Вы знаете, как это исправить? –

+1

Спасибо!Это помогло мне понять, что происходит и искать решение. –

+0

Это верно с 89 стандартом – GRC

1

Код инициализации struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; не учитывает указатель для следующего узла. Фактически он инициализирует 1-й указатель на 5, а второй на 0, что определенно не то, что вы хотите. Затем, когда вы ссылаетесь на третью с poly[2] = p1_terms[2];, в инициализаторе нет данных, поэтому вы указываете на случайные данные за пределами содержимого вашего массива. Когда вы берете Node_ptr next;. 2 узла потребляются на узел, поэтому он работает по назначению.

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