无法访问外部文件中定义的数组,W / O关键字“extern”

时间:2015-06-09 08:51:05

标签: c++ c arrays

我发现无论如何,我都无法访问外部文件中定义的数组。所以我在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;
}

你可以看到非常简单的测试。无论我使用什么方法访问外部文件中的数组,我都会出现分段错误。

3 个答案:

答案 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是一个外部变量名,因此可以在其他文件中访问它。