文件 1.c
int a[10];
文件 main.c:
extern int *a;
int main()
{
printf("%d\n", a[0]);
return 0;
}
给我一个段错误!出了什么问题?
最佳答案
数组分解,或者当作为参数传递给函数时隐式转换为指针,或者当转换为赋值运算符右侧的右值时。所以像这样:
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
工作正常。但这并不意味着数组本身就是指针。因此,如果您像对待指针一样对待数组,那么您实际上是在对待数组类型,就好像它是一个保存 int
对象地址的指针。由于您的数组实际上是一系列 int
对象,而不是指向 int
对象的指针,因此您实际上是在尝试取消引用某些未指向任何地方的内存位置有效(即,array
中的第一个槽是一个整数值,如 0
,这就像取消引用 NULL)。所以这就是你出现段错误的原因。请注意,如果您做了这样的事情:
int array[] = { 1, 2, 3, 4, 5};
int b = *array;
这仍然有效,因为 array
再次隐式转换为指向存储整数值序列的内存块的指针,然后取消引用以获取第一个序列中的值。但是在你的情况下,通过将你的数组声明为当前代码模块作为外部定义的指针,而不是数组,它将跳过通常完成的指针的隐式转换,并且只使用数组对象,就像它一样是指向对象本身的指针,而不是对象数组。
关于c - 指针数组外部问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054687/