【问题标题】:Structure making array display wrong values结构使数组显示错误的值
【发布时间】:2016-05-24 18:19:57
【问题描述】:

有谁知道为什么成员Node_ptr next; 使数组poly[1]poly[2] 的元素显示错误的值?如果我从结构 (struct node) 中删除 Node_ptr next;,我可以得到索引 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;
}

【问题讨论】:

  • {10, 1000, 5, 14, 1, 0}; 初始化列表错误。 --> {{10, 1000}, {5, 14}, {1, 0}}

标签: c arrays initialization structure


【解决方案1】:

引用 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 被初始化。

相关,来自同一章节

如果聚合或联合包含属于聚合或联合的元素或成员, 这些规则递归地适用于子聚合或包含的联合。如果初始化器 子聚合或包含的联合以左大括号开头,初始化器由 该大括号及其匹配的右大括号初始化 子聚合或包含的联合。 [...]

【讨论】:

  • 感谢您的快速回复。你知道怎么解决吗?
  • 谢谢!这有助于我了解正在发生的事情并寻找解决方案。
  • 从 89 标准开始就是这样
  • 初始化实际上违反了约束,因为5 不是指针的有效初始化程序。又一个“有用的”编译器扩展让程序员感到困惑的例子。
【解决方案2】:

您的初始化代码struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; 没有考虑下一个节点的指针。实际上,它将第一个指针初始化为 5,将第二个指针初始化为 0,这绝对不是您想要的。然后,当您使用poly[2] = p1_terms[2]; 引用第三个时,初始化程序中没有剩余数据,因此您指向的随机数据超出了数组的内容。当你把Node_ptr next; 拿出来的时候。每个节点消耗 2 个整数,因此可以按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多