【问题标题】:C: SEGFAULT with realloc on char **C: SEGFAULT 与 char 上的 realloc **
【发布时间】:2013-11-05 06:42:27
【问题描述】:

此代码的一系列问题中的另一个问题。我有以下函数将arg 与字符串数组reference 中的每个字符串进行比较:

char compare(char *arg)
{
        int iter=0;
        char retchar='0';

        while(iter < no_of_ref)
        {
        //      printf("arg : %s , reference : %s \n",arg,reference[iter]);
                if((strstr(reference[iter],arg) != NULL) || (strstr(arg,reference[iter]) != NULL))
                {
                        retchar='1';
                        break;
                }
          iter++;
        }
return retchar;
}

reference 是全局的 char ** ,但在 main 内部动态构建如下:

reference = calloc(CHUNK, sizeof(char *));

然后是一些代码,然后:

                        temp_in[pre_pip+1]='\0';
                        reference[no_of_ref]=malloc(strlen(temp_in) + 1);
                        strcpy(reference[no_of_ref++],temp_in);
                        memset(&temp_in,'\0',sizeof(temp_in));
                        pre_pip = -1;
   printf("INDEX: %d, address : %p , val : %s\n",no_of_ref-1,reference[no_of_ref-1],reference[no_of_ref-1]);      //DEBUG
                }
                /*If allocated buffer is at brim, extend it for CHUNK char *  further*/
                if(no_of_ref == (tr*CHUNK - 2))
                {
                        current_size = tr*CHUNK*sizeof(char *);

                        char *retalloc = realloc(reference,current_size + CHUNK*sizeof(char *));
                                if(retalloc == NULL)
                                        perror("ERROR on realloc");
                                else
                                {
                                        printf("Realloced successfully: %p\n",retalloc);
                                        tr++;
                                }

对于不需要realloc的测试用例,代码运行良好,即输入字符串的数量小于CHUNK。对于realloc,我从函数中得到SEGFAULT。以下是其中一次运行:

Program terminated with signal 11, Segmentation fault.
#0  __strstr_sse42 (s1=0x3839393433333230 <Address 0x3839393433333230 out of bounds>, s2=0x6020c0 <cmp> "8956549122") 

【问题讨论】:

  • 什么是temp_in?因为如果它是一个指针,那么语句 memset(&amp;temp_in,'\0',sizeof(temp_in)); 将不会按照您的预期进行。
  • 另外,您确实reference重新分配给realloc返回的指针?
  • temp_in 是一个静态数组 char temp_in[20];我没有重新分配参考。你的意思是在成功 realloc 后做参考=retalloc ?

标签: c segmentation-fault realloc


【解决方案1】:

realloc 实际上重新分配您传递给它的内存时,您作为参数传递的那个指针仍然指向 内存区域。 realloc 函数返回一个指向 new 内存的指针,因此您必须将其分配给例如reference.

【讨论】:

  • 我试过这样,因为引用是一个 char ** : printf("重新分配成功:%p\n",retalloc); retalloc=*参考; tr++;但没有运气
  • @DiwakarSharma 反过来:reference = (char **) retalloc; 调用realloc. (The cast is needed since retalloc`是char*)
  • 现在这已经清除了 SEGFAULT..!!但它是如何工作的我很困惑。 retalloc 将指向新分配内存的开始。当我们将其分配给参考时,参考会失去原始位置吗?
  • @DiwakarSharma 是的,但是realloc 分配新内存(它返回的指针),复制旧内存(之前由reference 指向),然后释放旧的记忆。您可能想阅读例如this reference.
  • 你永远是救世主..! :)
【解决方案2】:

realloc() 中的表达式需要用括号括起来

//---------------------------------v -------------------v
char *retalloc = realloc(reference,(current_size + CHUNK)*sizeof(char *));

假设CHUNK=100current_size=200,你的代码将分配200+100*8=1000 bytes 而你想要(200+100)*8 = 2400 bytes

另外,请确保在重新分配后将 retalloc 分配给 reference 变量。

【讨论】:

  • 同意重新分配的部分,但我认为你的尺寸错误。无论当前大小是什么,我只想要 CHUNK more char * 的空间。所以 CHUNK*sizeof(char *) 字节 + 当前大小字节。
猜你喜欢
  • 2015-02-05
  • 2013-03-29
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多