1

私はCを学習していて、ポインターを使用して配列内の各文字列を逆にしようとしています。以下のコードを実行すると、「swapChars」の引数1と2を渡すと、キャストなしで整数からポインターが作成されるという警告が表示されます。実行すると「バスエラー」が発生します。誰かが理由を知っていますか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swapChars(char *a, char *b) {
    char temp = *a; 
    *a = *b; 
    *b = temp; 
}


void reverse(int size, char* arr[]) { 
    for(int w = 0; w < size; w++) {
        int length = strlen(arr[w]); 
        for(int i = 0; i < length/2; i++) {
            swapChars(arr[w][i], arr[w][length-i]);
        }
    }
}

編集:ありがとう!エラーや警告は表示されなくなりましたが、「helloworld」で実行しても何も出力されない理由を知っていますか?これは私のmain()です:

int main(int argc, char* argv[]) {
    int numWords = argc-1;
    char** words = argv+1;
    reverse(numWords,words);
    for (char** word = words; word < words+numWords; word++) {
        printf("%s ",*word);
    }
    printf("\n");
    return 0;
}
4

2 に答える 2

3
swapChars( &(arr[w][i]), &(arr[w][(length-1)-i]));

配列要素自体ではなく、配列要素のアドレス(または「ポインタ」)を渡す必要があります。これがないと、コンパイラは、配列要素の値をポインタに変換しようとすることを警告します。これは、間違ったことであると思われます。だからそれはこれについてあなたに警告します。そして確かに-それはあなたが意図したものではありません。

@Piは私よりも正しいです。修正しました。2番目の引数に-1を追加します。そうしないと、文字列の最後のnullも逆になります。そのため、文字列は印刷されません。おそらく。

于 2012-06-24T20:55:10.157 に答える
2

引数を渡すときは、渡す両方の値を逆参照します。
これを修正するには、行は次のようになります。

swapChars(&arr[w][i], &arr[w][length-1-i]);

これにより、値ではなくアドレスが渡されます。

于 2012-06-24T20:59:25.490 に答える