c - 从 64 位机器中的 C 函数访问返回地址时出现段错误

标签 c pointers memory gcc segmentation-fault

我在 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/

相关文章:

c - 初始化结构值时出错

c - 我应该释放使用字符串文字初始化的 char* 吗?

c - AVR : Relocation truncated to fit

c++ - 智能指针与拥有原始指针

CUDA 数组缩减为元素总和。如何从设备向主机传达答案并打印?

c - 这个指向指针的指针是多余的吗?

c++ - C++ STL map 如何管理内存,以及如何绕过它

java - GC(垃圾收集器)如何标记一个对象进行垃圾收集?

c : matrix multiplication without * operator

c - 我想从 C 程序(Windows)调用一个命令(用户定义)