【发布时间】: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