【问题标题】:Realloc x86 x86_64重新定位 x86 x86_64
【发布时间】:2012-01-06 02:05:36
【问题描述】:

我有一个函数

void *srealloc(void * ptr , int size){
    void *tmp = realloc(ptr , size);
    if(tmp == NULL){
        fprintf(stderr,"realloc of %u bytes failed", size);
        exit(1);
    }
    return tmp;
}

调用它的代码在 x86 计算机上运行良好,但是当我在 x64 计算机上编译和运行相同的代码时,出现段错误。

如何调用它的一个例子是:

line = "Some string";
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines));
buffer[buffer_lines-1] = line;

当我在 segfaulting 计算机上调用 srealloc 时使用 gdb 进行跟踪 ptr == 0x0,大小 == 8

*编辑: 段错误发生在:

void *tmp = realloc(ptr, size);

【问题讨论】:

  • 请注意,sizeof(buffer) 是 指向 char 指针的指针 的大小。要正确,您应该使用sizeof(char *)。在这里并不重要,因为指向一种类型的指针的大小与指向另一种类型的指针的大小相同,只是想指出这一点。
  • 缓冲区是一个全局变量:char **buffer = NULL;
  • @JoachimPileborg 好点,我的代码最初是这样的,但出于挫败感,它一度被更改。
  • 可能与您的崩溃无关,但您的函数也有错误的签名,它应该与 realloc 本身相同。 int 不是“大小”的正确类型,切勿将签名类型用于此目的。特别是在现代 64 位架构上,int 通常只有 32 位,而 size_t 是 64。使用 size_t 它是为这样的事情而设计的。

标签: c segmentation-fault malloc 64-bit realloc


【解决方案1】:

您的电话看起来不错。 malloc()、realloc()、calloc() 或 free() 中的崩溃通常是程序中其他地方存在错误的症状,在这些错误中,您的写入超出了分配块的范围,并踩到了由内存分配函数。

尝试在 Valgrind 或 Purify 等工具下运行您的程序。

【讨论】:

  • 在运行 Valgrind 之后,当cp* 未初始化时,我发现我有一个strncpy(cp,line,strlen(line)+1)。当我调用 realloc 时,我认为这会导致一些崩溃。 Valgrind 是一个很好的选择。
【解决方案2】:

确保调用realloc 的代码具有该函数的有效原型(换句话说,包括stdlib.h)。

从 32 位切换到 64 位的许多问题涉及整数(如果没有原型,则为默认参数)和指针之间的差异。虽然在 64 位平台上整数可能保持在 32 位,但指针的大小可能会增加。

由于您声明指针为 NULL 并且请求的大小为 8,因此该函数的使用肯定是有效的。空指针的重新分配实际上与 malloc 相同。这就是我怀疑原型问题的原因。

还要确保您在新机器上编译所有内容。如果您尝试将 32 位编译的 srealloc 与 64 位编译的客户端链接起来,您可能会遇到问题。

【讨论】:

  • 在运行 Valgrind 之后,事实证明向strncpy() 发送垃圾指针正在搞乱我的堆。这并不能解释为什么我的代码在 x86 计算机上运行,​​但我很高兴我找到了这个错误的原因。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多