声明和定义之间的数组/指针不匹配 - 那么会发生什么?

kar*_*421 1 c

我正在通过C来到以下示例,我从"C指针"这本书中无法理解.这是代码.

以下声明存在于一个源文件中:

int     a[10];
int     *b = a;
Run Code Online (Sandbox Code Playgroud)

但是在不同的源文件中,这段代码是:

extern         int    *a;
extern         int    b[];
int            x, y;
...
x = a[3];
y = b[3];
Run Code Online (Sandbox Code Playgroud)

有人可以解释执行两个赋值语句时会发生什么吗?(假设整数和指针都占用四个字节.)

当我尝试运行代码时,它给了我分段错误x,当我将它注释掉并打印y的值时,它给了我0.概念是指针和数组之间的一些区别.

Ale*_*nze 5

会发生什么是未定义的行为,在您的情况下,它表现为一个分段错误.

你很可能想要这个:

int     a[10];
int     *b = a;

extern         int    *b;
extern         int    a[];
Run Code Online (Sandbox Code Playgroud)

然后你的两个任务都将获取a索引3处的元素并将其放入x和中y.

  • 我告诉过你,未定义的行为.这就是语言标准对你的保证. (2认同)
  • 对象"a"占用的内存包含10个"int".`extern int*a;`告诉编译器将对象`a`占用的内存视为包含指向`int`的指针(或指向`int'数组的指针).现在,在第一种情况下`a [3]`应该只是得到数组'a`的第3个元素.在第二种情况下`a [3]`将*尝试*(!)来:从对象`a`的内存中提取一个指针,将它推进到`3*sizeof(int)`bytes(通过加法),然后从那个记忆中读取.如果在添加之后数组"a"的第一个元素不能表示有效指针,则得到UB.同样w/b. (2认同)