指针数组 – 外部问题
文件1.c.
int a[10];
文件main.c:
extern int *a; int main() { printf("%d\n", a[0]); return 0; }
给我一个段错误! 出了什么问题?
当作为参数传递给函数时,或者在赋值运算符的右侧转换为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
工作得很好。 但这并不意味着数组本身就是指针。 因此,如果您像处理指针一样处理数组,那么您实际上将数组类型视为 – 如果它是一个将地址保存到int
对象的指针。 由于您的数组实际上是一个int
对象序列,而不是指向int
对象的指针,因此您实际上试图取消引用一些未指向任何有效位置的内存位置(即, array
的第一个插槽是一个数字整数值像0
那样就像取消引用一个NULL)。 这就是为什么你要分裂的原因。 请注意,如果你做过这样的事情:
int array[] = { 1, 2, 3, 4, 5}; int b = *array;
这仍然有效,因为array
再次被隐式转换为指向保存整数值序列的内存块的指针,然后取消引用以获取第一个序列中的值。 但在你的情况下,通过将数组声明为当前代码模块作为外部定义的指针而不是数组,它将跳过隐式转换为通常完成的指针,并且只使用数组对象as-if it是一个指向对象本身的指针,而不是一个对象数组。
在C FAQ中很好地解释了。 还有一个后续行动 。 第二个链接中的图片价值一百万美元。
char a[] = "hello"; char *p = "world";
简短回答: 使用extern int a[]
。
有点晚了,刚刚输入(并关闭)了这个问题的重复。 这里的答案没有提到头文件……
如果将数组a
的声明放在它所属的头文件中,而不是将其放在.c文件中,则会在编译时捕获该问题。 然后,头文件应包含在两个.c文件中,编译器可以看到您声明的内容是错误的。
您的头文件将包含:
extern int myarray[];
如果你将error: conflicting types for a
声明为指针,你会得到类似“ error: conflicting types for a
”之error: conflicting types for a
东西。
基本上你需要像这样写你的main.c:
extern int a[]; int main() { printf("%d\n", a[0]); return 0; }
查看以下代码的输出。
FILE1.C
#include extern int* my_arr; void my_print() { printf("%d", my_arr); }
main.c中
#include int my_arr[2] = {1,2}; extern void my_print(); void main() { my_print(); }
产量
1
在File1.c中,my_arr是一个指针变量,其值为1.意味着my_arr []的第一个元素被赋值给它。 然后,如果使用* my_arr访问内存位置ox1,则会因为不允许访问ox01而出现seg错误。
为什么my_arr指针被赋值为1(my_arr []的第一个元素)?
与汇编程序的工作方式有关。 阅读这篇文章
为什么你的代码无法访问0x01?
我知道它与操作系统有关,不允许用户代码访问某些地址空间。 这是我所知道的一切。 谷歌如果你想要更多的信息。