2011-11-25 97 views
3

我有一个函数realloc的86 x86_64的

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; 

当我用gdb跟踪通过时srealloc被称为计算机段错误PTR ==为0x0上,大小== 8

*编辑: 段错误发生在:

void *tmp = realloc(ptr, size); 
+1

如何声明缓冲区? – zneak

+0

行是char * – LeeG

+0

请注意'sizeof(buffer)'是指向char_的指针的_pointer的大小。为了正确,你应该使用'sizeof(char *)'。这里并不重要,因为指向一种类型的指针的大小与指向另一种类型的指针的大小相同,只是想指出这一点。 –

回答

3

你的通话看起来很好。在malloc(),realloc(),calloc()free()中发生崩溃通常是程序中其他位置的错误的一种症状,您在该位置写入的内容超出了已分配块的范围,并且被记忆体分配函数使用的内务处理信息踩踏。

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

+0

运行Valgrind后,发现'cp *'未初始化时,我有'strncpy(cp,line,strlen(line)+1)'。当我称之为realloc时,我认为这会导致一些粉碎。 Valgrind是一个很好的电话。 – LeeG

0

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

从32位切换到64位的许多问题涉及到整数(如果没有原型时是默认参数)和指针之间的不一致。虽然整数可能停留在64位平台上的32位,但指针的大小可能会增加。

由于您声明指针为NULL并且请求的大小为8,所以这当然可以有效地使用该函数。空指针的realloc与malloc实际上是一样的。这就是为什么我怀疑原型问题。

另外,请确保您在新机器上编译的一切。如果您尝试将32位编译的srealloc链接到64位编译的客户端,则可能会出现问题。

+0

运行Valgrind后,事实证明发送垃圾指针到'strncpy()'搞乱了我的堆。这并不能解释为什么我的代码在x86计算机上运行,​​但我很高兴我找到了这个错误的原因。 – LeeG