文件1里声明全局变量:int array[5];
文件2里声明全局变量:extern int *array;
问在运行时会不会报错,如果会,是在编译时还是在链接时?
答:编译与链接时均不报错,当用array[i]存取数组中元素时,运行时报错!
原因:
int array[5]; // :告知编译器,array是个数组名,其值就是元素的首地址
extern int *array; // :告知编译器,array是个指针,要知道 指针不等于数组名的!
具体的解释见下面的汇编:
//extern int array[5]; a[4]=123;
movl $123, array+16
声明成 数组时, array是个地址,array[i]实际上就是array+i
//extern int *array; a[4]=123
movl array, %eax
addl $16, %eax
movl $123, (%eax)
声明成指针时,需要对指针进行解引用
就是 先把指针里存放的值+偏移 然后解引用
文件2里声明全局变量:extern int *array;
问在运行时会不会报错,如果会,是在编译时还是在链接时?
答:编译与链接时均不报错,当用array[i]存取数组中元素时,运行时报错!
原因:
int array[5]; // :告知编译器,array是个数组名,其值就是元素的首地址
extern int *array; // :告知编译器,array是个指针,要知道 指针不等于数组名的!
具体的解释见下面的汇编:
//extern int array[5]; a[4]=123;
movl $123, array+16
声明成 数组时, array是个地址,array[i]实际上就是array+i
//extern int *array; a[4]=123
movl array, %eax
addl $16, %eax
movl $123, (%eax)
声明成指针时,需要对指针进行解引用
就是 先把指针里存放的值+偏移 然后解引用