2011-02-01 1 views
0

Cで2つの文字列を連結しようとしていますが、理由はわかりませんが、segfaultエラーが発生しています。下のコード行の最初の行にgdbを使って追跡しました。Cで文字列を連結しようとすると、このコードで何が問題になりますか?

strcat(tempString, "uptime"); 
    pFile = fopen (tempString,"r"); 

tempString is = "/ proc /"です。 tempStringに文字列 "uptime"を追加して、/ procフォルダにファイルがある場合はそのファイルを開こうとします。 memcpy()がstrcat()によって呼び出されると、実際のsegfaultが発生します。

+2

あなたは 'tempString'を正しく割り当てましたか? – John

+0

元々はありませんでしたが、今はchar tempString [80]に切り替えました。 – ihtkwot

答えて

6

は、あなたは、これらの行の前にいくつかのコードを示していないが、それは(一定のMEMサイズの割り当てで)一定の
2行目strcatがにatemptうことになり

tempString = "/proc/"; 

使用して割り当てられている可能性がtempStringです文字列定数を上書きします。これにより、バッファから6バイトを未知の領域(*成功した場合)に置きます。

使用が責任STRCAT:それはあなたが私たち示した場合の事を確認して役立つだろうJeremyPが指摘するように、それはテキストセグメントを指している場合http://beej.us/guide/bgc/output/html/multipage/strcat.html

*、読み取り専用で、セグメンテーション違反に

+5

実際、宣言についてのあなたの前提が正しいなら(私はそれが確信しています)、tempStringはテキストセグメント内の位置を指します。これは読み込み専用である可能性があります。これはおそらくsegフォルトの原因です。 – JeremyP

+0

これは私がやったことなので、strcpy(tempString、 "/ proc /")を実行するように変更しましたが、それでもやはり同じことをしています。 – ihtkwot

+1

@nmr:おそらく文字列のスペースを割り当てていないでしょう。 'char tempString [128];'のようなものを試してください(必要なサイズは変わるかもしれません)。 –

2

の原因となりますtempStringを定義する行。しかし、char * tempString = "/proc/";のようなものがあり、それを修正しようとしているようです。引用符で囲まれた文字列なので、修正することもできないこともあります。試してみると、セグメンテーションフォールトが発生する可能性があります。 (また、"/proc/"は7 char長さであり、そして最後には何も追加すると、何かまたは他を上書きします。)修正文字列の場合

、あなたは、スタックまたはヒープ上のいずれかに割り当てられ、独自のバッファを持っている必要がありますし、あなたはそれが十分に長いことを確認する必要があります。

+0

を追加しました。 "/ proc /"で6文字をカウントしますが、私は一日が早いので、間違っているかもしれません。 – RichardTheKiwi

+0

スペースの問題を処理するために配列を明示的に割り当てることはできますか?または、malloc()を使用する必要がありますか? – ihtkwot

+0

@nmrあなたは 'malloc()'を使うことができますが、スタック( 'char tempString [1024]')に割り当てることはあなたの方が簡単です。 – chrisaycock

関連する問題