加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

64位函数返回32位指针

发布时间:2020-12-16 03:24:30 所属栏目:百科 来源:网络整理
导读:这个函数被埋在一个复杂的嵌套中,所以实际上找到原因可能超出我能提出的任何要求,但我想知道是否有人可能能够提供一些关于我如何进行调试的提示. 这是我遇到问题的代码的要点 //func1.csomestruct* func1(somestruct* mystruct){ printf("func1: %p,%in",my
这个函数被埋在一个复杂的嵌套中,所以实际上找到原因可能超出我能提出的任何要求,但我想知道是否有人可能能够提供一些关于我如何进行调试的提示.
这是我遇到问题的代码的要点
//func1.c
somestruct* func1(somestruct* mystruct)
{
    printf("func1: %p,%in",mystruct,mystruct->foo);
    return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
    somestruct *mystruct = malloc(sizeof(somestruct));
    mystruct->foo = 10;
    printf("func2: %p,mystruct->foo);
    mystruct = func1(mystruct);
    printf("back in func2: %pn",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报告没有错误,实际上导致它成功完成.教科书heisenbug.至少我可以使用GDB.

有没有人知道可能导致这种情况的原因,或者至少我如何开始追查问题?

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读