0

このコードに関する一連の問題のもう 1 つ。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;
}

referenceglobalchar **ですが、次のように 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しています。以下は、実行の1つです。

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()式の括弧を次のように入れる必要があります

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

于 2013-11-05T06:51:59.467 に答える
1

realloc渡したメモリを実際に再割り当てすると、引数として渡したポインタはまだ古いメモリ領域を指しています。この関数は新しいreallocメモリへのポインタを返すので、それを eg に割り当てる必要があります。reference

于 2013-11-05T06:59:23.230 に答える