2017-09-18 65 views
-1

私は、私のような問題に対する多くの他の答えを検索して試しましたが、まだそれを得ることはできません。私はここで何が欠けているのか分かりません。このプログラムはオークションをシミュレートする必要があります。これは小さな「入札」が勝つゲームです。私はこのコードを考え出しましたが、strcpyとchar変数の型を使用すると、このセグメンテーションエラーが発生します。なぜ「セグメンテーションフォルト」が発生しますか?

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

int func02(int venc, int nj, int max, int mod, float med, char *nome); 
int lanc; 

int main (void) 
{ 

    lanc = func02(0, 36, 15, 0, 0, "nome"); 
    printf("%d", lanc); 
    return EXIT_SUCCESS; 
} 

int func02(int venc, int nj, int max, int mod, float med, char *nome) 
{ 

    int lance; 

    if (venc == 0) { 
     strcpy(nome, "ceadf"); 
     lance = 4; 
    } 
    else { 
     if ((med <= mod) && (venc >= mod)) { 
      lance = mod++; 
     } 
     else { 
      lance = venc++; 
     } 
    } 
    return(lance); 
} 
+0

'LANC = func02(0、36、15、0、0、 "ノーム");その後、'と 'strcpyの(ノーム、 "ceadf");'あなたがすべてで、この –

+0

コンパイルを行うことはできません警告とデバッグ情報( 'gcc -Wall -Wextra -g'と[GCC](http://gcc.gnu.org/)...)。 **デバッガを使用する** 'gdb' –

+0

@RohanKumarポストのスタイルを編集しないでください(自分の行にブレースを動かすなど)。 –

答えて

3

あなたはfunc02()に文字列リテラル"nome"に合格し、あなたはそれを書いています。

文字列リテラルは読み取り専用です、それらへの書き込みはあなたがリテラル文字列に文字列をコピーするには、関数のstrcpyを使用するカントセグメンテーションfailt

1

のように未定義の動作につながります。

代わりに動的に文字列を割り当ててからstrcpy()を呼び出します。

1

まず、このような質問を投稿するときに、コードがクラッシュしている行、できればバックトレースを表示することをお勧めします。ことで、ここで何が起こっているのです:

lanc = func02(0, 36, 15, 0, 0, "nome"); 

ここでは、func02に定数文字列「ノーム」を送っています。あなたは二つの理由で失敗した、nomeに "ceadf" をコピーしようとしている

ここ
strcpy(nome, "ceadf"); 

  1. nomeは文字列定数です。それを変更することはできません。

  2. は、あなたがそれを修正することができたとしても、それは(「ノーム」の各文字とNULLバイト)ロングのみ5文字だ、とあなたは(そこに「ceadf」の各文字を6つのバイトをコピーしようとしていますさらにヌルバイト)。書き込み可能な文字列で作業していたとしても、これはメモリの問題です。一般的には、私はstrcpyの使用を避けたいと思います。このように間違いを犯すのは簡単です。

関連する問題