ここで考えるべきことがいくつかあります。元の例は次のとおりです。
char *ab = NULL;
//ab = "abc123"; // works fine
sprintf(ab, "abc%d", 123); // this line seems to crash the program
char *ab = NULL;
文字へのポインタであり、NULLに初期化されます。
ab = "abc123";
のように見えない限り、うまくいったとは思いませんchar *ab = "abc123";
。これはchar *ab
、読み取り専用の文字列に初期化したためです。初期化はおそらくコンパイル時に行われました。
ポインタsprintf(ab, "abc%d", 123);
のメモリを事前に初期化していないため、行が失敗しました。char *ab
言い換えれば、あなたは次のようなことをしませんでした:
ab = malloc((sizeof(char) * 3) + 1); /* + 1 allows for null string terminator. */
問題は2つの方法のいずれかで修正できます。上記のように動的メモリを割り当てるか、文字列をcharのように固定長の配列にすることができますab[25] = {0};
。通常、私は1024、256、または文字列の長さのケースのほとんどをカバーするいくつかの数値のような長さの配列を作成します。次に、配列を操作する関数にcharポインターを使用します。