64位函数返回32位指针

2024-01-13

这个函数被埋在一个复杂的嵌套中,所以实际上找到原因可能超出了我所能要求的范围,但我想知道是否有人能够提供一些关于我如何调试它的提示。 这是我遇到问题的代码的要点

//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 位,然后在顶部填充 ffffffff。

当在 32 位机器上编译时,它可以正常工作。

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

有谁知道可能导致此问题的原因,或者至少我如何开始追踪问题?


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

默认情况下,所有返回值都是 int。因此,如果函数缺少原型,则编译器会将返回值视为 32 位并生成 32 位返回值的代码。那就是你的高 4 个字节被截断的时候。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64位函数返回32位指针 的相关文章

随机推荐