我有一个函数
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;
当在分段故障计算机上调用srealloc时,我使用gdb进行跟踪PTR == 0x0, size == 8
*编辑:段故障发生在:
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位编译的客户端链接,可能会遇到问题。