1
int main(int argc, char **argv){
    char *str = argv[1];
    size_t len = strlen(str);
    char *dst = calloc(len+1, sizeof(char));
    int i;
    for(i=len-1; i>=0; i--){
        memcpy(dst, str+i, 1);
        dst++;
    }
    *(++dst) = '\0';
    printf("%s\n", dst);
    free(dst);
    return 0;
}

読みやすくするためにエラーチェックを省略しまし
た。「glibcfree():invalid pointer:」というメッセージでセグメンテーション違反が発生した理由がわかりません。ポインタ
を使用して文字列を反転する小さなプログラムを作成しようとしていますが、
1)最後のprintfは何も出力しません。
2)セグメンテーション違反が発生しました

4

3 に答える 3

9

あなたが持っている:

   char *dst = calloc(len+1, sizeof(char));
   /* ... */
   *(++dst) = '\0';
   /* ... */
   free(dst);

/freeによって割り当てられたポインタが必要です。ここで変更しました。後でできるように、コピーを作成してください。malloccallocfree

于 2013-03-10T15:40:23.337 に答える
3

問題は、計算でポインタを変更していることです。またはを
使用してみてください: temporiginal

int main(int argc, char **argv){
    char *str = argv[1];
    size_t len = strlen(str);
    char *dst = calloc(len+1, sizeof(char));
    char *origDst = dst;
    int i;
    for(i=len-1; i>=0; i--){
        memcpy(dst, str+i, 1);
        dst++;
    }
    *(dst) = '\0';
    printf("%s\n", origDst);
    free(origDst);
    return 0;
}
于 2013-03-10T15:42:02.167 に答える
1

考慮すべき点が 2 つあります。calloc1 つは、既に ouah によって共有されているように割り当てられた元のポインターのコピーを作成することです。もう 1 つのポイントは、NULLが格納されるときのポインタのインクリメントをなくす*(++dst) = '\0';こと*dst = '\0';です。これら 2 つの変更により、プログラムを問題なく実行できます。

于 2013-03-10T15:48:24.530 に答える