c - 将复合文字分配给数组指针会在同一地点和时间同时给出预期结果和垃圾?

标签 c arrays pointers c99 compound-literals

#include <stdio.h>

int main(void) {
    int a[5], *p, i;
    p = a;
    p = (int []){1, 2, 3, 4, 5};
    for (i = 0; i < 5; i++, p++) {
        printf("%d == %d\n", *p, a[i]);
    }
    return 0;
}

你瞧(YMMV):

$ gcc -O -Wall -Wextra -pedantic -std=c99 -o test test.c; ./test
1 == -1344503075
2 == 32767
3 == 4195733
4 == 0
5 == 15774429

通过指针算法打印数组显示它确实包含 1 到 5 的整数序列,但再次打印假定通过索引表示的相同数组会给出未初始化的废话。为什么?

最佳答案

你只分配给p,永远不会分配给a,所以a永远不会被初始化。

int a[5], *p, i;
// a uninitialized, p uninitialized
p = a;
// a uninitialized, p points to a
p = (int []){1, 2, 3, 4, 5};
// a uninitialized, p points to {1, 2, 3, 4, 5}

关于c - 将复合文字分配给数组指针会在同一地点和时间同时给出预期结果和垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8507102/

相关文章:

c:使用函数将新节点插入到单链表中

c - 通过Cgo访问aerospike C客户端报错

python - 如何获取反向排序列表的索引?

python - 将字符串和数字读入数组

java - 如何通过抽象类实现函数指针的 Java 等价物

c - 如何使两个在其他方面相同的指针类型不兼容

c++ - 尝试使用指向结构 vector 的指针访问结构类型时出错

c - Valgrind 条件跳转或移动取决于未初始化的值

c - 为什么一位 `int` 位域的值是 0 和 −1?

php - 如何解析发送到 ajax 的 POST 数据?