结构使数组显示错误的值

时间:2016-05-24 18:19:57

标签: c arrays initialization structure

有谁知道为什么成员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;
}

2 个答案:

答案 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个整数,因此它按预期工作。