Realloc segfault - 旧的大小无效

时间:2014-12-07 15:27:42

标签: c segmentation-fault malloc realloc

我有一个功能,其中第二次传递给我每次段错误,我不知道如何解决它。任何建议将不胜感激。

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;
}

3 个答案:

答案 0 :(得分:2)

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]

在你的情况下,你应该使用一个额外的变量来保持分配的内存的大小。

答案 1 :(得分:1)

   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]显然是不受限制的,因此发生了未定义的行为。

答案 2 :(得分:1)

要修复的样本。

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;
}