0

这段代码的一系列问题中的另一个。我有以下函数,它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") 
4

2 回答 2

1

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

于 2013-11-05T06:59:23.230 回答
1

您需要将括号放在表达式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

此外,请确保在重新分配后分配retallocreference变量。

于 2013-11-05T06:51:59.467 回答