2011-01-24 4 views
0

私はCの基礎を学ぼうとしていますが、なぜこのコードが機能しないのかわかりません。 reverse()のwhileループはバスエラーを引き起こします。私はプログラミングインタビューの本でほぼ同じコードを有効な解決策として見つけましたが、私はここに掲載されているこれと他の同様の方法のどちらも、バスエラーなしで私のために働くことはありません。インプレイスストリングin C逆

#include <stdio.h> 

void reverse(char* str) { 
char* end = str; 
char tmp = 0; 
if(str) { 
    while(*end) { 
    end++; 
    } 
    --end; 
    while(end>str) { 
    tmp = *end; 
    *end-- = *str; 
    *str++ = tmp; 
    } 
} 
} 

int main() { 
char* a = "12"; 
puts(a); 
reverse(a); 
puts(a); 

return 0; 
} 
+1

http://stackoverflow.com/questions/4493139/are-string-literals-constと他の多くの質問(少なくとも週に1回以上)を参照してください。 – ephemient

答えて

4

問題は、定数リテラル文字列を読み込み専用にすることです。 mainの宣言をchar a[] = "12";に変更して、書き込み可能な文字配列にしてください。

+0

ありがとう!それは大いに役立ちます。 – Tiki

2

未定義の動作につながる文字列リテラルを変更しようとしています。

変更

char* a = "12"; 

char a[] = "12"; 
+0

うわー、ありがとう! – Tiki

-2

endと同じメモリ位置へstrポイントなので - >彼らは、同じオブジェクトの2人の異なる名前です。

+0

"オブジェクト"?これはCです! (とにかく 'end'と' str'は2行のコードで同じ位置を指します。) – ladenedge

+0

その場での逆のポイントがありません:文字列バッファ内で動作する2つのポインタを使います。低レベルのもの、確かに;それは効率的で速くなければなりません。 – winwaed

+1

@ladenedge: "Object"は、C言語標準で使用されている正しい単語です。 –