【问题标题】: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]
    

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

    【讨论】:

    • 呃,那它给了什么?
    • @user3885166 字符串的长度。
    • 有什么区别,我以为char*是c中的字符串?
    【解决方案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] 显然是越界,因此发生了未定义的行为。

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 2014-08-26
        • 2012-02-02
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多