2011-10-26 27 views
1

私はCの文字列を反転する関数を書いた本の例に従っています。 これは以下の問題です。しかし、私はgccを使ってubuntuの下で実行します。私はsegの欠陥を得る。 私はそれをデバッグしようとしましたが、私はこの行を '* start ++ = * end; segフォルトが発生します。シンプルなcプログラムでsegフォールトを起こすのに問題があります

誰かが私にseg faultを理解するのを助けてくださったことを感謝します。

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

void myreverse(char* str) { 
    int len = strlen(str); 
    char tmp; 

    char* start = str; 
    char* end = str + (len -1); 

    while (start < end) { 
     tmp = *start; 
     // this is causing Segmentation fault 
     *start++ = *end; 
     *end-- = tmp; 
    } 
} 

int main(void) { 
    char* test = "Hello World"; 
    puts(test); 
    myreverse(test); 
    puts(test); 
    return EXIT_SUCCESS; 
} 
+0

[Cの文字列定数を変更しますか?](http://stackoverflow.com/questions/480555/modifying-c-string-constants) – Mat

+0

一般に、 'int'は長さを保持するには不十分ですCの文字列。'size_t'は一般的には最良の型で、' strlen() 'が返すものです。 –

答えて

0
char* test = "Hello World"; 

segment..Thenライン内のその位置の内容セグメンテーションフォールトを引き起こし

*start++ = *end; 

..

だけ

char* test = "Hello World"; 
0123この行を変更

char temp[] = "Hello world"; 
char *test = temp; 

から

、それはより多くの詳細についてはthisスレッドをcrash..Seeないでしょう。..

0

文字列バッファは読み取り専用メモリです。文字列リテラルは変更できません。

strcpyまたはstrdupを使用して、書き込み可能なメモリのバッファを作成します。

char* test = strdup("Hello World"); 

完了したら文字列を解放してください。

+1

また、 'test'をcharの配列として定義することをお勧めします。' char test [] = "Hello World"; ' –

0
char* test = "Hello World"; 

文字列リテラルであること。それは読み取り専用です。それを変更することはできません。あなたはそれを修正しようとしている

:)

0

ここで答えを参照してください:Modifying a C string: access violation

を基本的にはC文字列リテラルのみ読み込まれ、書き込みができません。

あなたが変更しようとしているあなたのmyReverse関数にこのアドレスを渡しているあなたは、動的に文字ポインタに文字列を与えるとき、あなたが与える文字列を読むには、データの一部だけを保存されます
1

文字列リテラルは、実行可能ファイルの読み取り専用のセクションに格納されています。 char* test = "Hello World";char test[] = "Hello World";に変更することで回避できます。"Hello World"はアレイテストにコピーされます。

0

私の経験に基づいて、変数のスコープ外のメモリ位置にアクセスしようとするとsegフォルトが発生します。 Cは境界チェックをしていないので、あなたのコードのどこかにあなたのコードで予約していないメモリ位置へのポインタをインクリメントしていると思います。コード内で割り当てられていないメモリ位置を反復するだけでは、他の目的で使用されているデータに干渉し、予期しない結果が生じる可能性があるためです。

+0

startが有効なメモリ位置に割り当てられていることを確認するだけです。問題はそれが読書にのみ有効であるということです。 –

+0

右。 "start"は最初の文字を指します。わかります。私は、コンパイラがアクセス権を与えたくない場所、つまり言い換えれば、「開始」が終わると言っていました。私は決して専門家ではありませんが、seg faultとそれが何を意味するかという私の一般的な経験に基づいていくつかの洞察を与えようとしています。この場合は、読み込み専用なので、コンパイラが許可していない "書き込み"アクセスと言います。正しい? – quicksort

関連する問題