指针数组 - 外部问题

Raj*_*pal 20 c arrays pointers extern segmentation-fault

文件1.c.

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

文件main.c:

extern int *a;

int main()
{
    printf("%d\n", a[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我一个段错误!出了什么问题?

Jas*_*son 24

当作为参数传递给函数时,或者在赋值运算符的右侧转换为r值时,数组会分解或隐式转换为指针.所以类似于:

int array[10];
int* a = array;  //implicit conversion to pointer to type int

void function(int* a);
function(array);  //implicit conversion to pointer to type int
Run Code Online (Sandbox Code Playgroud)

工作得很好.但这并不意味着数组本身就是指针.因此,如果您像处理指针一样处理数组,那么您实际上将数组类型视为 - 如果它是一个将地址保存到int对象的指针.由于你的数组实际上是一个序列int对象不是指针,以及int对象,你实际上是试图取消引用到未指向一些内存位置的任何地方有效(即,在第一个插槽array是一个数字整数值喜欢0这会就像取消引用一个NULL).所以这就是为什么你是segfaulting.请注意,如果你做过这样的事情:

int array[] = { 1, 2, 3, 4, 5};
int b = *array;
Run Code Online (Sandbox Code Playgroud)

这仍然有效,因为array再次隐式转换为指向保存整数值序列的内存块的指针,然后取消引用以获取第一个序列中的值.但在你的情况下,通过将数组声明为当前代码模块作为外部定义的指针而不是数组,它将跳过隐式转换为通常完成的指针,并且只使用数组对象作为 - 如果它是一个指向对象本身的指针,而不是一个对象数组.

  • 我查看编译器输出以查看此行为,如果您熟悉平台的基本汇编语言,则非常明显.您将看到数组引用实际上被机器以完全相同的方式处理,就好像它是指针访问一样.[此问题](http://stackoverflow.com/questions/1461432/what-is-array-decaying)也可能提供一些帮助. (2认同)

cni*_*tar 16

C FAQ中很好地解释了.还有一个后续行动.第二个链接中的图片价值一百万美元.

char a[] = "hello";
char *p = "world";
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

简答:使用extern int a[].