Realloc x86 x86_64

Realloc x86 x86_64,c,segmentation-fault,malloc,64-bit,realloc,C,Segmentation Fault,Malloc,64 Bit,Realloc,我有一个函数 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计算机上编译并运行相同的代码时

我有一个函数

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计算机上编译并运行相同的代码时,会出现segfault

如何调用此函数的示例如下:

line = "Some string";
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines));
buffer[buffer_lines-1] = line;
当我在segfaulting计算机上调用srealloc时使用gdb进行跟踪 ptr==0x0,大小==8

*编辑: SEG故障发生在:

void *tmp = realloc(ptr, size);

你的电话看起来不错。
malloc()
realloc()
calloc()
free()
中的崩溃通常是程序中其他地方的错误的症状,在这些地方,您编写的代码超出了分配的块的边界,并且践踏了内存分配函数使用的管理信息


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

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

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

因为您声明指针为NULL,请求的大小为8,所以这肯定是函数的有效用法。空指针的realloc实际上与malloc相同。这就是我怀疑原型问题的原因


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

请注意
sizeof(buffer)
是指向char的指针的指针大小。要正确,您应该使用
sizeof(char*)
。这在这里并不重要,因为指向一种类型的指针的大小与指向另一种类型的指针的大小相同,我只想指出这一点。buffer是一个全局变量:
char**buffer=NULL
@JoachimPileborg很好,我最初的代码是这样的,但出于挫折,它在某一点上被更改了。可能与您的崩溃无关,但您的函数也有错误的签名,它应该与
realloc
本身相同
int
不是“大小”的正确类型,切勿将有符号类型用于此目的。特别是在现代64位体系结构上,
int
通常仅为32位,而
size\u t
为64位。使用
size\u t
它是为这样的事情而设计的。在运行Valgrind之后,当
cp*
未初始化时,我发现有一个
strncpy(cp,line,strlen(line)+1)
。我想这会导致后来我打电话给realloc时发生一些轰动。Valgrind是一个很好的调用。在运行Valgrind之后,发现向
strncpy()
发送垃圾指针是在搞乱我的堆。这并不能解释为什么我的代码在x86计算机上运行,但我很高兴我找到了这个错误的原因。