c - 指针数组外部问题

标签 c arrays pointers segmentation-fault extern

文件 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/

相关文章:

c - 当目标文件和静态库中存在相同的符号时,链接器不会发出多个定义错误

c - 在 C 中获取内置参数

java - 如何检查将字符串值与数组中的每个元素进行比较?

c - 制作一个程序来实现与数组一起使用的函数

c++ - Pointer-to- "inner struct"成员是否被禁止?

C 带全局变量的链表

c++ - 如何编写与字节序无关的 C/C++ 代码?

c - 如何在 C 中将一个字符中的两个数字相加?

c++ - 使用 new 为 unsigned char 数组分配内存失败

c++ - 空指针指针(void **)