あなたがするとき:
char * cmd;
スタックにポインタを割り当てています。このポインタは、意味のある値に初期化されていません。
次に、これを行うと:
strcpy(cmd, argv[0]);
argv[0]
に含まれている文字列を、が指すアドレスにコピーしますcmd
。これは...意味がありません。あなたは幸運なので、それは単にsegfaultsです。
これを行うとき:
cmd = "plop";
静的に割り当てcmd
られた文字列定数のアドレスに割り当てます。このような文字列は読み取り専用であるため、それらへの書き込みは未定義の動作です。
それで、これをどのように解決するのですか?書き込み先のランタイムにメモリを割り当てます。2つの方法があります:
1つ目は、次のようにスタックにデータを割り当てることです。
char cmd[100]; // for instance
char
これにより、スタックに100秒の配列が割り当てられます。ただし、必要なメモリの量を事前に知っておく必要があるため、必ずしも堅牢であるとは限りません。スタックもヒープよりも小さいです。これにより、オプション番号2が表示されます。
char *cmd = malloc(whatever_you_need); // no need to cast, by the way, unless you're in C++
whatever_you_need
char
これにより、ヒープにsが割り当てられます。free
使い終わったら、メモリを解放することを忘れないでください。