【发布时间】:2016-05-17 23:00:42
【问题描述】:
int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
导致段错误,而
int nums[] = {5, 2, 1, 4};
printf("%d\n", nums[0]);
没有。 现在:
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
打印 5.
基于此,我推测数组初始化符号 {} 会盲目地将这些数据加载到左侧的任何变量中。当它是 int[] 时,数组会根据需要填充。当它为int*时,指针被5填满,存储指针之后的内存位置被2、1和4填满。所以nums[0]试图deref 5,导致segfault。
如果我错了,请纠正我。如果我是正确的,请详细说明,因为我不明白为什么阵列initializers按照他们的方式工作。
【问题讨论】:
-
与所有启用的所有警告编译,您的编译器应告诉您发生什么。 span>
-
@GSerg 这绝不是重复。这个问题中没有数组指针。尽管该帖子中的某些答案与此处的答案相似。
-
@Lundin 我有 30% 的把握,所以我没有投票关闭,只发布了链接。
-
养成使用
-pedantic-errors标志运行 GCC 的习惯并观察诊断。int *nums = {5, 2, 1, 4};是无效的 C。