プロが教えるわが家の防犯対策術!

char *name
この宣言でプログラムの組初めはこれでいけたのですが
char *name = (char *)malloc(sizeof(char) * 10);
後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。

なぜこうなるのでしょうか?
それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?

A 回答 (4件)

はなはだ失礼なことを申し上げますが、C言語の基本を理解されていないと思われます。


一般的に変数は、その内容にある値を設定してからでないと、その変数を使用することは、出来ません。これを変数の初期化と言います。
例えば int型の変数 aを確保したとして、これを初期化しないで使用するとどうなるかです。
int a;
として
if (a==10){
printf("aは10です\n");
}else{
printf("aは10ではありません\n");
}
上記のプログラムを実行するとぢうなるでしょうか。
答えは、「どうなるか判らない」です。
たまたま、「aは10です」が表示される場合もありますし、
たまたま、「aは10ではありません」が表示される場合もあります。
これは、int 型の変数aを確保したときに、その内容を初期化していないので、なにが入っているか判らない為にこの状態が発生します。
int型の変数を初期化せずに使った場合は、プログラムがどちらに転ぶか判らないだけですが、ポインター型の変数を値を初期化せずに使用した場合は、事情は異なってきます。
char *name;とした状態では、ポインターnameは初期化されていません。
従って例えば strcpy(name,"abc");
を実行したとすると、ポインターの示す先に、文字列"abc"をコピーします。
では、このポインターの示す先は、いったいどこなのでしょうか。
答えは、「初期化されていないので判らない」です。
とすると、たまたま、コピーしても安全なところを示している場合は、セグメンテーション違反は発生しません。
ところが、たまたま、コピーしてはならないアドレス(OSのみにアクセスが許されるアドレス、例えば0番等)を示していると、セグメンテーション違反になります。
>それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?
メモリを必要とする時です。この意味が理解できるようになるためには、もう少し、ポインターについて、いろいろとプログラミングをして、ポインターになれることが必要です。
    • good
    • 0
この回答へのお礼

いろいろと説明を聞いてるうちに分かってきました。ありがとうございます。

お礼日時:2007/07/01 13:44

>それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?


使うタイミングもですが、使い終わった時の処理も重要
です。
malloc()等で動的に確保したメモリは使い終わった後は
free()等で解放しておかないと、メモリリークを起こし
メモリ不足によるプログラム異常の原因となります。

プログラムの他の部分を見ないと判りませんが、malloc()
で動的にメモリを確保する必要があったのでしょうか?
#エラーが起きるから対症療法的にmalloc()を使用した様に
#思えます。
char name[10]; では駄目ですか?
    • good
    • 0

以前動いていたのは偶然・たまたま・運が良かっただけです。


char *name
だけでは領域も確保されていないし初期化もされていません。
何処にアクセスしているか全く分からない状態ですのでセグメンテーション・フォルトが起こって当然です。
    • good
    • 1

> char *name


> この宣言でプログラムの組初めはこれでいけたのですが

このときに、nameにどうやってアクセスしていたかと、

> char *name = (char *)malloc(sizeof(char) * 10);
> 後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。

このときに、nameにどうやってアクセスしているかを比べてみないことには、
何とも言えません。

可能でしたら、「前はこんなコードだった」と「今はこんなコードである」という
両方を見せてください。
前のコードはもう残っていないかもしれませんが…。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!