gpt4 book ai didi

c - 64 位函数返回 32 位指针

转载 作者:太空狗 更新时间:2023-10-29 16:52:58 26 4
gpt4 key购买 nike

这个函数隐藏在一个复杂的嵌套中,所以真正找到原因可能超出了我所能问的任何问题,但我想知道是否有人可以提供一些关于我如何调试它的提示。这是我遇到问题的代码的要点

//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。

有谁知道可能是什么原因造成的,或者至少我应该如何开始追踪问题?

最佳答案

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

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

关于c - 64 位函数返回 32 位指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23144151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com