我发现无论如何,我都无法访问外部文件中定义的数组。所以我在c和c ++中做了一些简单的测试:
在C:
的main.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int func();
char arr[100]="";
int main()
{
for(int i=0;i<=9;++i){
func();
printf("%s\n",arr);
}
return 0;
}
func.c
#include<string.h>
#include<stdio.h>
extern char* arr;
int func(){
strcat(arr,"hello"); // try to access arr here
return 0;
}
在C ++中:
的main.cpp
#include<iostream>
using namespace std;
int func();
char arr[100]="";
int main()
{
for(int i=0;i<=10;++i){
func();
cout<<arr<<endl;
}
return 0;
}
func.cpp
#include<cstring>
extern char* arr;
int func(){
strcat(arr,"hello"); // try to access arr here
return 0;
}
你可以看到非常简单的测试。无论我使用什么方法访问外部文件中的数组,我都会出现分段错误。
答案 0 :(得分:6)
变量链接不是类型安全的。
问题在于您定义名称&#34; arr&#34;引用一个数组 假设数组位于地址0x10,它看起来像这样:
Address 0x10 0x11 0x12 0x13
Content | 0 | 0 | 0 | 0 | (... 100 zeroes in total)
名称&#34; arr&#34;指的是存储此数组的位置。
在&#34; func.cpp&#34; (以及&#34; func.c&#34; - 它们完全相同)你声称或声明,名称&#34; arr&#34;是指针 这是一个骗局,因为它不是你定义的那样,但是编译器和链接器盲目地信任你。
这个谎言导致func
中的代码将存储在地址0x10的值解释为指针而不是数组。
使用32位指针,即
Address 0x10 0x14
Content | 0 | 0 | (...)
当你strcat
进入0
时,事情就不顺利了。
如果你在数组中存储一些比零更明显的东西(例如"\1\2\3\4"
)并检查调试器中的指针,那么数组的元素将变得更加明显&#34; 34;指针的值。
解决方法是提出适当的主张; arr
是一个数组:
extern char arr[];
(请注意,在变量声明中,与函数参数相反,char arr[]
不与char* arr
相同。)
答案 1 :(得分:2)
使用
SELECT artkod, price, image FROM product_table
而不是
extern char arr[];
虽然在C中的许多情况下数组被隐式转换为指针,但数组与指针不同。你有一个指针,而不是声明。 func.c中的声明与main.c中的定义不匹配。
答案 2 :(得分:-1)
简单的是你必须在两个地方都使用extern关键字。
在main.c
extern char arr[100]="";
和func.c
extern char *arr;
这将告诉编译器arr是一个外部变量名,因此可以在其他文件中访问它。