我在 C (linux(x86_64)) 中有这样的代码:
typedef struct
{
char k[32];
int v;
}ABC;
ABC states[6] = {0};
ABC* get_abc()
{
return &states[5];
}
在 main() 中:
int main()
{
ABC *p = get_abc();
.
.
.
printf("%d\n", p->v);
}
我在访问 p->v 时在 printf 语句中遇到段错误。我试图从 gdb 调试它,它说“无法访问内存”。这里有一件重要的事情是,当我编译这段代码时,gcc 在 ABC *p = get_abc(); 上向我发出警告,提示我正在尝试从整数转换指针。我的问题是我从 get_abc() 返回结构地址,那么为什么编译器会给我这样的警告?为什么编译器将其视为整数?我认为由于此警告,我遇到了段错误,因为整数无法在 x86_64 中保存内存地址。
如有任何帮助,我们将不胜感激。
最佳答案
在main
函数之前定义get_abc
原型(prototype)。如果函数原型(prototype)在该函数调用之前不可用,编译器将默认将该函数视为传递 int
参数并返回 int
。这里 get_abc
实际上返回 8 字节地址,但该值已被压缩为 4 字节并存储在导致崩溃的 ABC *p
变量中。
ABC* get_abc();
int main()
{
ABC *p = get_abc();
}
注意:在 int 大小和地址大小为 4 字节的 32 位机器上不会发生此崩溃,因为不会发生抑制。但是那个警告会在那里。
关于c - 从 64 位机器中的 C 函数访问返回地址时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589314/