gpt4 book ai didi

c++ - 无法访问外部文件中定义的数组,W/O 关键字 "extern"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:11 25 4
gpt4 key购买 nike

我发现无论如何,我都无法访问在外部文件中定义的数组。所以我在 C 和 C++ 中做了一些像这样的简单测试:

在 C 中:

主.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;
}

函数.c

#include<string.h>
#include<stdio.h>

extern char* arr;
int func(){
strcat(arr,"hello"); // try to access arr here
return 0;
}

在 C++ 中:

主要.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;
}

函数.cpp

#include<cstring>
extern char* arr;

int func(){
strcat(arr,"hello"); // try to access arr here

return 0;
}

如您所见,非常简单的测试。无论我使用什么方法访问外部文件中的数组,我都会遇到段错误。

最佳答案

变量链接不是类型安全的。

问题是您定义名称“arr”来引用数组。
假设数组位于地址 0x10,它看起来像这样:

Address     0x10  0x11  0x12  0x13
Content | 0 | 0 | 0 | 0 | (... 100 zeroes in total)

名称“arr”是指存储此数组的位置。

在“func.cpp”(和“func.c”——它们的工作方式完全相同)中,您声明或声明,名称“arr”指的是一个指针。
这是一个谎言,因为它不是您定义的那样,而是编译器和链接器盲目地信任您。

这个谎言导致 func 中的代码将存储在地址 0x10 的值解释为指针而不是数组。
如果是 32 位指针,那就是

Address  0x10   0x14
Content | 0 | 0 | (...)

当您将 strcat 放到 0 上时,事情就不顺利了。

如果您在数组中存储比零更不同的内容(例如 "\1\2\3\4")并在调试器中检查指针,则更明显的是数组的元素已“成为”指针的值。

解决方法是做出正确的声明; arr 是一个数组:

extern char arr[];

(请注意,在变量声明中,与函数参数相反,char arr[]char* arr 相同。 )

关于c++ - 无法访问外部文件中定义的数组,W/O 关键字 "extern",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30727248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com