• ベストアンサー

「セグメンテーション違反」について

参考書に載っていたプログラムを打ち込みながら勉強していたのですが、次のプログラムを動かしたときに「セグメンテーション違反」と出てきました。 /* 可変書式による印字_簡単な棒グラフ */ #include <stdio.h> main() { char *f, *a; int i; f="%2d = %-20.1s\n"; a="********************"; for(i=1; i<10; i++){ *(f+11)=i+'0'; printf(f,i,a); } } コンパイル後に、 「セグメンテーション違反です」 と、表示されて終わってしまいます。 何処が問題だったのでしょうか???教えて頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

char *fが指している先は文字列リテラルです。 http://www9.plala.or.jp/sgwr-t/c/sec10-3.html 文字列リテラルは書き換えのできない領域に置かれることの方が多いですから書き換えようとするとエラーになります。 ついでに…そんな例の載っているような参考書は使用しない方がよいかと。 char f[]="%2d = %-20.1s\n"; だったら動作するかも知れません。

cccprogram
質問者

お礼

アドバイスに加え参考HPまで御紹介して頂きありがとうございました。 ちなみに参考書はK&R訳した石田晴久先生の1985年の著書「Cプログラミング」だったので、そこそこ信用しながら勉強していました...

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

それは書式を直接いじるのではなく printf("%2d = %-20.*s\n", i, i, a); のように書式を工夫すべし. 最初の i は %2d に対応し, 次の i が * のところ に入ります.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

for ループ中 *(f+11) = i+'0'; で文字列リテラルに書き込んじゃっています. 処理系によっては, 文字列リテラルを「読み込み専用領域」に置くことがありますので, 「文字列リテラルに書き込む」という操作をやるとこのように問題が発生することがあります. ちなみになにがやりたいんでしょうか? 目的によっては書式文字列をうまく指定するだけでいけるかもしれません.

cccprogram
質問者

お礼

早速の解答、ありがとうございました。助かりました。 何がやりたかったのかと申し上げますと、 1=* 2=** 3=*** ... 9=********* みたいな、アスタリスクで棒グラフを作るようなプログラムを作成したかったのです。

関連するQ&A