-2

プログラムで argp を使用していますが、グローバルに定義された char doc[] を使用してプログラムに関する情報を表示しています。

プログラム情報とは別に、GPL 通知をこのドキュメントに追加したいと考えています。

GPL 通知は、他のいくつかの場所で使用されているため、const char * として定義されています (ただし、これを変更してもかまいません)。

最初に私はこれを試しました:

static char doc[] = strcat("basic program info", GPLNOTICE);

しかし、これは次のようになります。

error: initializer fails to determine size of ‘doc’

次に、文字列に変換してみました:

static char doc[] = (string("basic program info") + string(GPLNOTICE)).c_str()

しかし、それは同じエラーを与えます

次に、docをchar *にすることもできると思いました

static char *doc = strcat("basic program info", GPLINFO)

...しかし、これはセグメンテーション違反でクラッシュします

GPL 通知をマクロ定義に変換しようとしましたが、実際には何もできませんでした

4

1 に答える 1

2

この行がクラッシュする理由:

strcat("basic program info", GPLINFO)

これは、読み取り専用メモリに格納されている定数文字列リテラルを変更しようとするためです。これにより、未定義の動作が発生します。の正しい使用法はstrcat、代わりに次のようになります。

static char buf[1024];
strcpy(buf, "basic program info");
strcat(buf, GPLNOTICE);

ただし、std::stringでプログラミングしているため、C スタイルの文字列の代わりに使用することをお勧めします。

std::string doc("basic program info");
doc += GPLNOTICE;

また、使用する前に、これらのような関数のドキュメントを読むことをお勧めします:)

于 2013-03-30T08:04:38.240 に答える