C 64位函数返回32位指针

C 64位函数返回32位指针,c,pointers,64-bit,C,Pointers,64 Bit,这个函数被隐藏在一个复杂的嵌套中,因此我可能无法真正找到原因,但我想知道是否有人能够提供一些关于如何调试这个函数的提示。 下面是我遇到问题的代码要点 //func1.c somestruct* func1(somestruct* mystruct) { printf("func1: %p, %i\n", mystruct, mystruct->foo); return mystruct; } //func2.c somestruct* func1(somestruct* m

这个函数被隐藏在一个复杂的嵌套中,因此我可能无法真正找到原因,但我想知道是否有人能够提供一些关于如何调试这个函数的提示。 下面是我遇到问题的代码要点

//func1.c
somestruct* func1(somestruct* mystruct)
{
    printf("func1: %p, %i\n", mystruct, mystruct->foo);
    return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
    somestruct *mystruct = malloc(sizeof(somestruct));
    mystruct->foo = 10;
    printf("func2: %p, %i\n", mystruct, mystruct->foo);
    mystruct = func1(mystruct);
    printf("back in func2: %p\n", mystruct);
    free(mystruct);
}
我叫func2。输出是这样的

func2: 0x7f38a00008c0, 10
func1: 0x7f38a00008c0, 10
back in func2: 0xffffffffa00008c0
(SEGFAULT trying to free 0xffffffffa00008c0)
实际的代码更复杂,“mystruct”在许多其他地方也可以毫无问题地传递,函数位于不同的文件中这一事实似乎是问题的一部分,是的,它需要返回指针(返回的指针不能保证与输入指针相同)。 在我看来,这真的很奇怪,它有点(但实际上不是)被截断为32位,然后在顶部填充FFFFFF

在32位机器上编译时,它的工作原理与它应该的完全相同

我曾考虑过某个地方的内存损坏,所以我通过valgrind运行了它。Valgrind没有报告任何错误,事实上,它使它成功完成。教科书海森堡。至少我可以使用GDB


有人知道是什么原因导致了这个问题,或者至少知道我应该如何开始追踪这个问题吗?

如果您遗漏了func2.c中的函数原型(somestruct*func1(somestruct*mystruct);),请检查您的代码


默认情况下,所有返回值都是int。因此,如果函数缺少原型,则编译器将返回值视为32位,并为32位返回值生成代码。在我看来,这就像一个指针被转换为带符号的int(32位),然后再转换回一个指针。位31(32位int的符号位)正在扩展为高32位。同一项目中由同一makefile编译的文件是否具有相同的设置?func1实际上是做什么的?func1目前和上面写的完全一样,除了“tts_struct*get_outrance(tts_struct*outrance,char*text)”之外。出于测试目的,它忽略了过去所做的一切,只是立即返回给出的语句:输出是相同的。是的,两个文件位于同一个probject、同一个makefile中,作为单独的对象文件构建,然后在最后链接在一起。您的原型有问题,func2()没有适合func1()的原型。您在这里发布的示例代码中没有显示这一点,因此请尝试找出它,或者发布真正的交易。(也可以在启用警告的情况下编译。)缺少原型和默认int返回(特别是在c代码中)也是我的问题。