C语言 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)] = '';
      k = k / 2;
   }
   printf("n%s.", bin);
   return bin;
}

>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]

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

要修复的示例。

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] = '';
    printf("n%s.", bin);//reversed
    return bin;
}
   char* bin;
   bin = calloc(1,1);

现在bin指向一个包含 0 的 1 字节空间。

   while(k > 0) {
      bin = realloc(bin, strlen(bin)*sizeof(char)+1);

不确定k会是什么。无论如何,自 bin[0] == '' 年以来strlen(bin) == 0 .之后,bin指向另一个存储0 的 1 字节空间。

      bin[strlen(bin) - 1] = (k % 2) + '0';

在这里strlen(bin)再次返回0,访问bin[0-1]显然是越界的,因此发生了未定义的行为。

相关内容

  • 没有找到相关文章

最新更新