【问题标题】:Realloc segfault - invalid old sizeRealloc segfault - 无效的旧大小
【发布时间】:2015-02-05 07:02:57
【问题描述】:
我有一个函数,其中第二遍每次都会给我段错误,我不知道如何修复它。任何建议将不胜感激。
char* testBefore(int k){
char* bin;
bin = calloc(1,1);
while(k > 0) {
bin = realloc(bin, strlen(bin)*sizeof(char)+1);
bin[strlen(bin) - 1] = (k % 2) + '0';
bin[strlen(bin)] = '\0';
k = k / 2;
}
printf("\n%s.", bin);
return bin;
}
【问题讨论】:
标签:
c
segmentation-fault
malloc
realloc
【解决方案1】:
strlen 没有给出数组的大小。
这不会扩大内存:
bin = realloc(bin, strlen(bin)*sizeof(char)+1); //0+1 == 1
然后对该内存调用 strlen 将产生未定义的行为,因为结果
strlen(bin) - 1 将为负数:
bin[strlen(bin) - 1] = (k % 2) + '0'; //bin[0-1]
在你的情况下,你应该使用一个额外的变量来保持分配内存的大小。
【解决方案2】:
要修复的样本。
char* testBefore(int k){
char* bin;
int i = 0;
bin = calloc(1,1);
while(k > 0) {
bin = realloc(bin, (i+1)*sizeof(char)+1);
bin[i++] = (k % 2) + '0';
k = k / 2;
}
bin[i] = '\0';
printf("\n%s.", bin);//reversed
return bin;
}
【解决方案3】:
char* bin;
bin = calloc(1,1);
现在bin 指向一个包含0 的1 字节空间。
while(k > 0) {
bin = realloc(bin, strlen(bin)*sizeof(char)+1);
不确定k 会是什么。无论如何,strlen(bin) == 0,因为bin[0] == '\0'。
之后,bin 指向另一个存储0 的 1 字节空间。
bin[strlen(bin) - 1] = (k % 2) + '0';
这里strlen(bin) 再次返回0,访问bin[0-1] 显然是越界,因此发生了未定义的行为。