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

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中的内存地址.

任何帮助,将不胜感激.

ras*_*hok 5

get_abcmain功能之前定义原型.如果函数原型在该函数调用意味着之前不可用,则编译器将默认将该函数视为传递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个字节,因为不会发生抑制.但那个警告会在那里.