1

次のコードは、ubuntu Linux では意図したとおりに印刷されますが、Windows の cygwin では何も印刷されません。ただし、 is_rotation 関数で free(t) を取り除くと、問題なく動作します。メモリ管理が悪いのか、それとも cygwin の問題なのかを知りたいです。なぜそれが起こっているのですか。また、メモリ管理を改善するためのその他の提案。

コードは次のとおりです。

/**
* sub is a substring of str or not
**/
int is_substring(const char* str,const char* sub){
    const char* s1=str;
    const char*  s2=sub;
    int count=0;
    while(1){       
        if(*s2=='\0') return 1;
        else if(*s1=='\0') return 0;
        else if(*s1==*s2){
            count++;
            s2++;
        }   
        else{
            if(count!=0){
                s1-=count;
                count=0;
                s2=sub;
            }
        }
        s1++;
    }
    return 0;
}
/**
* s1 and s2 are rotations of eachother or not, given only the is_substring function.
**/
int is_rotation(const char* s1,const char* s2){
    int l1=strlen(s1);
    if(l1!=strlen(s2)) return 0;
    char* t=malloc(2*l1*sizeof(char));
    strcat(t,s1);
    strcat(t,s1);
    int r=is_substring(t,s2);
    free(t);
    return r;
}

/**
* USAGE: ./a.out string1 string2
**/
int main(int argc, char *argv[]){
    if(argc<3) return 1;
    printf("is_substring=%d",is_substring(argv[1],argv[2]));
    printf("\nis_rotation=%d",is_rotation(argv[1],argv[2]));
    return 0;
}

助けてくれてありがとう :)

4

2 に答える 2

4

問題は最初のstrcat()呼び出しにあります。代わりに a に置き換える必要がありstrcpy()ます。

int is_rotation(const char* s1,const char* s2){
    int l1=strlen(s1);
    if(l1!=strlen(s2)) return 0;
    char* t=malloc(2*l1*sizeof(char) + 1);
    strcpy(t,s1); // initialize with strcpy() so we have a null in the string
    strcat(t,s1);
    int r=is_substring(t,s2);
    free(t);
    return r;
}

malloc()通常、割り当てたバッファを初期化しないことに注意してください。おそらくubuntuのものはそうですが、保証されていません。cygwin では、バッファが初期化されていないためstrcat()、文字列をコピーする前にヌルを探してメモリを歩いています...これは、割り当てられたバッファの終わりを過ぎている可能性が非常に高いです。

l1また、最終的な文字列の null ターミネータを保持するために、バッファに余分な文字を追加する必要があります... null ターミネータの + 1の長さの 2 倍です

于 2013-04-25T22:56:23.940 に答える
1

これはあなたのスタックを殺すバグです:

char* t=malloc(2*l1*sizeof(char));
strcat(t,s1);
strcat(t,s1);

最初strcatはどこかに文字を追加します...使用しているため、バッファmallocの内容は不明です。tまた、ゼロにはもう 1 バイト必要です。

char* t=malloc(2*l1+1); // (2*l1+1)*sizeof(char)
strcpy(t,s1);
strcat(t,s1);
于 2013-04-25T22:56:48.483 に答える