有谁知道为什么成员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;
}
答案 0 :(得分: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
初始化。
相关,来自同一章
如果聚合或联合包含聚合或联合的元素或成员, 这些规则递归地应用于子聚合或包含的联合。如果初始化者 subaggregate或包含的联合以左括号开始,初始化器由括号括起 该大括号及其匹配的右大括号初始化元素或成员 subaggregate或包含的联合。 [...]
答案 1 :(得分:1)
您的初始化代码struct node p1_terms[] = {10, 1000, 5, 14, 1, 0};
未考虑下一个节点的指针。实际上它将第一个指针初始化为5,将第二个指针初始化为0,这绝对不是你想要的。然后,当您使用poly[2] = p1_terms[2];
引用第3个时,初始化程序中没有剩余数据,因此您指向超出数组内容的随机数据。当你取出Node_ptr next;
时。每个节点消耗2个整数,因此它按预期工作。