Awa*_*ais 2 c memory gcc pointers segmentation-fault
我有C代码(linux(x86_64)),有些像这样:
typedef struct
{
char k[32];
int v;
}ABC;
ABC states[6] = {0};
ABC* get_abc()
{
return &states[5];
}
Run Code Online (Sandbox Code Playgroud)
在main()中:
int main()
{
ABC *p = get_abc();
.
.
.
printf("%d\n", p->v);
}
Run Code Online (Sandbox Code Playgroud)
我在访问p-> v时在printf语句中遇到分段错误.我试图从gdb调试它,它说"无法访问内存".这里有一件重要的事情是,当我编译这段代码时,gcc会在ABC*p = get_abc()上向我发出警告; 我试图从整数转换指针.我的问题是我从get_abc()返回结构地址然后为什么编译器给我这样的警告?为什么编译器认为它是整数?我认为由于此警告我正在获得分段错误,因为整数不能保存x86_64中的内存地址.
任何帮助,将不胜感激.
get_abc在main功能之前定义原型.如果函数原型在该函数调用意味着之前不可用,则编译器将默认将该函数视为传递int参数并返回int.这里get_abc实际返回8字节地址,但该值已被抑制为4个字节,并存储在ABC *p导致崩溃的变量中.
ABC* get_abc();
int main()
{
ABC *p = get_abc();
}
Run Code Online (Sandbox Code Playgroud)
注意:这种崩溃不会发生在32位机器中,其中int的大小和地址的大小是4个字节,因为不会发生抑制.但那个警告会在那里.