2012-04-03 18 views
1

私はこの問題のトラブルシューティングを試みて、何もせずに終了しました。正しい方向に私を助けてくれることを願っています。私はchar型の配列をこのように初期化プログラムがあります。strcpyの後にCプログラムがクラッシュする

char variable1[8]; 

をそして私は、関数1()は文字列値を返す関数すなわち

... 
strcpy(variable1, (char *)function1()); 

の戻り値をコピーしよう。私はstrcpyの行を実行しようとすると、

char* function1() 
{ 
    .... 
    char variable2[8]={'\0'}; 
    ... 
    return (variable2); 
} 

プログラムがクラッシュ: はここではfunction1の構造です。

私はhere

重要

ことstrcpyの関数に読んでいる:あなたは宛先バッファ(S1)は終端のNULLバイトを含むソース配列内のすべての文字を含めることが可能であることを確認する必要があります。そうでなければ、strcpy()はバッファオーバーフローを起こしてバッファオーバーフローを引き起こし、プログラムがクラッシュする可能性があります。

したがって、変数1のサイズを20に引き上げようとしましたが、プログラムがクラッシュしました。

それ以外は、別のアプローチ、つまりstrncpy関数呼び出しを使用しましたが、それでも私には同じエラーが表示されます。

奇妙なことは、問題なく値を返すfunction1()を実行できることです。私はそれをコピーしようとしたときだけ、私のプログラムがクラッシュします。私は次に何をすべきですか?

+0

は、デバッガを使用する方法を学びます。そしてコンパイラに警告を与えることができます(例えば、 'gcc -Wall -Wextra')、警告が表示されなくなるまであなたのソースを改善してください。 –

答えて

10

宛先バッファが小さすぎるためではありません。使用しようとする前に、ソース文字列を含む変数が範囲外になったためです。

function1の中では、variable2がスタック上に作成されますが、この機能を終了すると効果的に破棄されます。後で(たとえばstrcpy操作で)使用しようとすると、未定義の動作になります。

あなたが機能出口を生き残る配列をしたい場合、あなたはおそらく、ヒープからそれを割り当てたい:

char *function1 (void) { 
    return calloc (1, 8); // allocate and zero out 8 bytes 
} 

、その後、ポインタを解放することを忘れないでください。

+0

私はあなたがここで言うことを理解していますが、function1自体の内容にヌルターミネーターが追加されています。つまり、function1()の内容を追加した上記の編集済みの質問を参照してください。だから今、何が問題なの? –

+1

@ vampirus87:あなたは最初のバージョンからかなり変更されているので、私はあなたの答えを更新しました。 – paxdiablo

+0

そうですね、ええ、私はfunction1のコンテンツを追加することが大きな影響を持っていることに気付きました。言い換えれば、変数が有効範​​囲外であるということです。しかし、ここで 'strcpy(variable1、(char *)function1());'私はfunction1()コールを使用している、技術的にはまだ正しく動作するはずですか? –

1

charの値はchar*ではないし、キャストしてもそれはそうしないという問題があります(コンパイラは不平を停止するだけです)。したがって、プログラムがクラッシュする理由は、無効なポインタを逆参照しようとしているからです。

試してみてください。

variable[0] = function1(); // store the returned character 
variable[1] = 0;   // make sure there's a terminating null char 
関連する問題