68user's page 掲示板

Prev< No. 421〜424> Next  [最新発言に戻る] [過去ログ一覧]
No. 421 # かんじゃ@C修行中 [E-mail] 1999/08/16 (月) 10:35
>> seg fault のメッセージが表示されてうまく実行できません。
> 現在、手元には その本もUNIX環境もないので、確かなことは
> 言えませんが、どこかで char *buf="abc" などと初期化して
> いる部分があると思います。・・・以下省略

さっそくのご教示ありがとうございます。
以上参考にさせていただき、さらに修行していきます。

No. 422 # mm 1999/08/20 (金) 22:54
文字列リテラルは、昔のCでは、結構普通に書き換えたりしてたみたいです。
unixの古いccのライブラリでも、この書き換えをやっているという話を聞いたことがあります。
(聞いたのは、一時ファイルの名前を作るライブラリ関数だったような…)
ANSI C以前は、自動変数の場合には、配列の初期化ができなかったために、
便宜的に利用してたのかもしれません。それとも、スタックに文字列を確保しても、
これを関数の呼び出し元に返すことはできないので、mallocを使う代わりに
静的領域を利用してたのかな…にしても毎回同じ領域が使用されるので、
static にすれば済むことって気も…?

いずれにしても、ROM化やコンパイラが同じ文字列リテラルを共用させるために、
ANSI C以降は、文字列リテラルの変更は未定義とされたようです。

No. 423 # 68user 1999/08/27 (金) 06:31
> いずれにしても、ROM化やコンパイラが同じ文字列リテラルを共用させるために、
に加えて、複数プロセスでデータセグメントを共有させるため、
例えば ls を並行して2個実行した場合、スタックとヒープは
2個用意されるが、データセグメントは1個しか用意されない、
と思ってるんですが、全然違うかも。
# アセンブラやってないんで、ここらへん いまいち感覚的に理解できない。

No. 424 # mm 1999/08/28 (土) 01:31
>に加えて、複数プロセスでデータセグメントを共有させるため、
DOSが長いもので、マルチプロセスのメモリ管理はよく分からないです(苦笑)。

>例えば ls を並行して2個実行した場合、スタックとヒープは
>2個用意されるが、データセグメントは1個しか用意されない、
とすると、文字列リテラルだけでなく、静的な変数まで共有される
訳ですよね。
素人考えでは、ホントにそれで良いの?と思っちゃいます…
例えば、コマンドラインオプションで設定されるフラグが
グローバル変数だったりすると(あり得ますよね)、前後のlsの
オプション指定が異なる場合に、先のlsのフラグまで影響を
受けちゃうおそれがないのかなぁ…?

Prev< No. 421〜424> Next  [最新発言に戻る] [過去ログ一覧]