1

非常に単純な文字列反転関数を作成したところ、理解できない問題に直面しました。

void reverse(char *data) {
    int length = 0,i;   
    char *temp,*start,*end;
    start = data;
    end = data;
    length = strlen(data);
    end = end + (length -1);
    for(i=0; i< length/2; i++) {
        *temp = *end;
        *end = *start;
        *start = *temp;
        start++;
        end--;
    }
}

int main()
{   
    int length1 = 0;
    char data1[100] = "I am megharaj from india";
    printf("data1 %s\n", data1);
    reverse(data1);
    printf("reversed\n");
    printf("data1 %s\n", data1);    
    return 0;
}

これによりセグメンテーション違反が発生しますが、をに変更するchar *tempchar temp、以下に示すようにすべてが正常に機能します。

void reverse(char *data) {
    int length = 0,i;   
    char temp,*start,*end;
    start = data;
    end = data;
    length = strlen(data);
    end = end + (length -1);
    printf("length %d\n", length);
    for(i=0; i< length/2; i++) {
        temp = *end;
        *end = *start;
        *start = temp;
        start++;
        end--;
    }
}

理由がわかりません。説明していただけますか?

4

3 に答える 3

1

*start は、data1 配列 i'e here を指していますstart = data;

*end は data1 配列を指しています。end= data;

しかし、*tempどこも指していません。

メモリが割り当てられておらず、 inchar *tempの値を格納しようとしているため、セグメンテーション エラーが発生します。*end*temp

代わりに使用してみてください

char temp;
于 2013-11-06T05:58:01.940 に答える