たとえば
int *i;
とかせんげんすると、
i が指す位置に int 分の
メモリは確保されるの?
ごめんなさい。追加。
まさか、iの数値は不定なんですか?
だとしたらやばいプログラムを
大量に作ってきたことになる。
3 :
されない:1999/06/15(火) 22:03
int j;
int *i;
i = &j;
ひつよう
4 :
なぜならば:1999/06/15(火) 22:08
ただ、メモリ領域の獲得と同時に型宣言をしているだけだから。
ポインタ領域4バイト、int4バイトならば極端なはなし
j = (int)i;
も可能
わかる?
5 :
ドルバッキー:1999/06/15(火) 22:57
1は、正確には (int *) 分のメモリが確保されますニャー。
バイト数は合ってても、可搬性NGですニャー。
整数として使うとき、インクリやデクリが面倒ですニャー。
これはまずい。
やばいプログラムの山だ。
でも、どうしてまともに動いてたんだろ?
DOSかつスモールモデルだったからかな?
7 :
malloc:1999/06/17(木) 16:18
使え
int分確保するのに
malloc使うの?う〜ん。
自分の作ったソースを眺めてみた。
問題のあるソースはそんなにないように見えた。
が、FILE *って確保してないな。
でも、サンプルプログラムでも確保してないし。
構造体だからか?もしくはfopenがメモリを確保するのか?
10 :
ドルバッキー:1999/06/21(月) 15:41
fopenが確保すると思ってて大丈夫だと思うニャー。
・・・オレもそう思ってるニャー。
11 :
ドルバッキー:1999/06/21(月) 15:47
>目さん
(int *)と(int)を混同して使い回したいなら、mallocを使って・・・
int **ppi;
int *pi;
ppi=(int **)(pi=(int *)malloc(4));
//(int)として・・・
*pi=4;
//(int *)として・・・
*ppi=pi;
・・・なんて使い方もできるかもニャー・・・使わないけど。
12 :
目:1999/06/21(月) 16:49
>ドルバッキーさん
頭が混乱してきました。
まあ、こんな使い方はしないけど。
13 :
鯖:1999/06/21(月) 18:36
>目さん
int i.**ppi;
data = (int **)malloc(4*sizeof(int *));
for (i=0;i<4;i++){
data = (int *)malloc(6*sizeof(int)); // ppi[4][6]
}
こっちのほうが、メモリの動きが分かりやすいかな〜
結局、構造体と同じくメモリをラインで確保するの
ちなみにこんな使い方は、よくあるよ〜
14 :
目:1999/06/21(月) 18:42
>鯖さん
>結局、構造体と同じくメモリをラインで確保するの
よくわからないんですが、
ラインで確保っていうのはどういうことなんでしょう。
15 :
鯖:1999/06/21(月) 19:21
>目さん
>ラインで確保っていうのはどういうことなんでしょう。
mallocは呼び出されると、連続したメモリ領域を確保するの
ポインタは、その確保したメモリの先頭のアドレスを示してるだけ
ポインタ分かんないと、作れないプログラムがいっぱいあるから頑張って勉強してね
でも、ポインタの説明って3.4.5のレスですべてだと思うけどね
16 :
ドルバッキー:1999/06/21(月) 19:24
>鯖さん
data = (int *)malloc(6*sizeof(int)); // ppi[4][6]
・・・は、
*(data+i) = (int *)malloc(6*sizeof(int)); // ppi[4][6]
・・・じゃなくてもいいのですかニャー?
17 :
鯖:1999/06/21(月) 19:49
>ドルバッキーさん
>・・・じゃなくてもいいのですかニャー?
うぐぅ、そうです
指摘してくれてありがと〜
18 :
Boolean:1999/06/22(火) 01:37
19 :
ほげほげ:1999/06/22(火) 03:58
プロになって、さんざんCのコードを記述する内に判りますよ。
20 :
鯖:1999/06/22(火) 08:34
>Booleanさん ← かっこいい名前だね
char *a;
char b[10];
a=(char *)malloc(10*sizeof(char));
〜〜 なんか動作するの 〜〜〜
free(a);
〜〜〜〜〜〜〜〜〜〜〜〜〜〜
終了
あのね、上の場合だと bはプログラム終了まで10バイト確保したまま
でも、aは途中で10バイト確保していらなくなったら解放できるから便利なの
メモリを動的に使うと必要なメモリしか確保しないから、メモリ領域を圧迫しないの
21 :
衝撃君.:1999/06/22(火) 12:53
>JAVAからいくことにします。
>責任もって教えて下さいね。 ( ̄ー ̄)ニヤリッ
じゃぁ教えよう。
まずJAVAじゃなくて、Java(TM)だってこと。コレ、案外大事。
C言語は誰のモノでもない。まぁ言ってみればミンナのモノな
んだけど、Javaは実質Sunの持ち物なんだ。Sunという企業が
組み込み系からエンターブライズ分野まで全部制覇するため
に作った商品群、Javaはそのブランド名なのね。
それがJavaの強みでもあるし、潜在的な弱点でもある。
どうだいヤメタクなったかい?
22 :
衝撃君.:1999/06/22(火) 12:54
あ、書き込むスレッド間違ったごめん。
23 :
ひろゆき:1999/06/22(火) 13:09
うーん、、そんなこといわれると、ちょっと危険な気もするなぁ、、
24 :
Boolean:1999/06/22(火) 14:49
鯖さん、Resありがとうごさいます。
一応完成しましたが、このやり方で問題あるのでしょうか?
(配列を動的メモリーに確保する構造体literature)
struct literature {int *data;};
int main(void){
int i; struct literature card;
card.data =(int *)malloc(10*sizeof(int)) ;
for (i=0;i<=9;i++) scanf("%d".card.data+i);
for (i=0;i<=9;i++) printf("%d\n".*card.data+i);
free(card.data);
25 :
鯖:1999/06/22(火) 16:32
>Booleanさん
一個所だけ、ちょっと違います
>for (i=0;i<=9;i++) printf("%d\n".*card.data+i);
for (i=0;i<=9;i++) printf("%d\n".*(card.data+i));
もし
*data = 3
*(data+1) = 1 .....
の時でも、表示は 3.4.5.6.7....ってなっちゃうよ
でも、構造体のデータの渡し方は完璧です ヽ(´ー`)ノ
26 :
Boolean:1999/06/22(火) 18:50
鯖さん、指摘ありがとうございます。
1.2.3..と連続した数値を入れてチェックしていたので、
間違いに気づきませんでした。
27 :
名無しさん:1999/08/12(木) 09:50
*(card.data + i) は、普通 card.data[i] と書く人が多いよ。
どっちでもいいけどね。
28 :
>27:1999/08/12(木) 11:32
私の場合
ポインタで宣言した変数は*(card.data + i)
配列で宣言した変数はcard.data[i]
と使い分けています。
単なる気分の問題ですが。
29 :
>28:1999/08/12(木) 12:02
そういう人多いです。悪いわけじゃないです。
でも、後者の方がおすすめです。特にデータ構造が深いとき。
(((box + i)->card + j)->member + k)->data
box[i].card[j].member[k].data
前者で書かれると僕には訳がワカランのですが、どうでしょう。
30 :
AO:1999/08/13(金) 00:39
>29 横レスです。。。
結果が同じなら、読みやすい書き方にしましょう。。。
前者のほうは、括弧を間違えると違うものになっちゃいます。。。
実装系によっては、配列アクセスはペナルティが大きいんですが、
普通はオプティマイザが何とかしちゃうんで、問題ないです。。。
31 :
マッケンロウ:1999/08/13(金) 04:31
いまだにポインタわからないままC使ってます。
ポインタだけの説明をした本とか出てますが、
これでポインタがわかったという本があれば紹介してください。
こんな時もやっぱりK&Rですか?
32 :
AO:
>31
あまり、入門書は読んだことないんでどれを進めたら良いか判らないけど、
むかし、新人君にK&Rを勧めたけど、今ひとつ難しいと感じたみたいです。。。
ポインタに関しては、ASCIIから出てるCの解説書にポインタ編ってのがあって
友人がしきりに進めてましたが。。。この本はもともと、DOSコンパイラ用に
書かれたものみたいで、ちょっと記述に問題があった記憶があります。。。