C语言结构体赋值异常排查:无法为disc结构体赋值,输出始终为0
排查C语言结构体赋值异常:pos成员始终为0的问题
嘿,看了你的代码,立刻发现两个关键问题导致你遇到的诡异现象——每次输出都是0,而且看起来完全无法给结构体赋值。咱们一个个说:
问题1:结构体定义位置颠倒了
你在代码里先声明了disc dArr[30];,然后才用typedef struct disc{...} disc;定义这个结构体类型。C语言是从上到下编译的,编译器遇到disc类型的时候根本不知道它是什么!虽然有些宽松的编译器可能不会直接报错,但这属于未定义行为,会导致后续对结构体的操作完全不符合预期,甚至直接忽略你的赋值逻辑。
问题2:数组索引越界,循环没有遍历正确元素
你写的d = &(dArr[numDiscs]);大错特错:
- 数组的有效索引是从0到
numDiscs-1(假设numDiscs ≤30),dArr[numDiscs]已经超出了数组的范围,访问的是数组后面的未知内存区域,这里的数值是未初始化的垃圾值(你刚好看到0纯属巧合)。 - 更糟的是,不管循环多少次,你都在访问同一个越界的内存位置,自然每次输出都是一样的0,而且根本没碰你真正想操作的
dArr[0]到dArr[numDiscs-1]这些元素。
另外,你代码里根本没有给pos成员赋值的逻辑——哪怕索引正确,未初始化的局部数组里的数值也是随机的,只是你刚好碰到了0而已。
修正后的代码
我把问题都改好了,加了注释说明:
// 先定义结构体类型,确保编译器在使用前能识别它 typedef struct disc{ double pos[2]; } disc; #include <stdio.h> int main() { int numDiscs = 5; // 这里替换成你实际的numDiscs值 disc dArr[30]; struct disc *d; double x_offset, y_offset; // 先给结构体数组的pos成员赋值(关键!不然都是垃圾值) for (int i = 0; i < numDiscs; i++) { dArr[i].pos[0] = i * 1.5; // 示例x值,你可以换成自己的赋值逻辑 dArr[i].pos[1] = i * 2.0; // 示例y值 } // 遍历数组,访问每个有效元素 for (int i = 0; i < numDiscs; i++) { d = &dArr[i]; // 用循环变量i作为索引,访问第i个元素 x_offset = d->pos[0]; y_offset = d->pos[1]; printf("The x is: %f, y is: %f\n", x_offset, y_offset); } return 0; }
额外提醒
- 永远记住数组索引从0开始,绝对不要访问超出数组长度的索引,轻则输出垃圾值,重则直接导致程序崩溃。
- 自定义类型(比如结构体)的定义一定要放在所有使用它的代码之前,或者用前向声明(但这里直接移到前面更简单)。
- 局部变量(比如栈上的
dArr)默认是未初始化的,使用前必须显式赋值,不然结果完全不可预测。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

