[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 23:32 / Filesize : 137 KB / Number-of Response : 653
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門編)Part 58



1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ]
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 57
pc12.2ch.net/test/read.cgi/tech/1260020924/
★過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

285 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:26:15 ]
ちょっと心温まる豆知識
インクリメント・デクリメント・サクラメント・ハラスメント



Cだと++って書けば自動的に値が1増えるし
--って書けば自動的に値が1減るが

CPUの機能として、そのようなものを持っていないものが多い。
特にRISC。
これらのCPUではアセンブラになると逆にそういうことができない。
1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。



残るサクラメントとハラスメントだが、CPUには何の関係もない。
単なる語呂合わせに過ぎん。

286 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:29:33 ]
CISC はアセンブラで書くために命令が高級なんだよな。
今はもうアセンブラで書くやつはいないから CISC はレガシーだな。

287 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:31:20 ]
>>285
いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく
見るけど、どういうつもりなのかマジで疑問。

288 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:35:40 ]
>>286
SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね

289 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:36:38 ]
俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。
が、いろんなところでよく使われるMIPSはそんな便利な命令はない。

むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端


290 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:39:46 ]
>>286
それ、認識が十数年くらい遅れてる。

291 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:40:54 ]
SPARCのinc %regは add %reg, 1, %reg のマクロだけど
結局1命令なので実質あるのと同じ

292 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:05:40 ]
また湧いてきたか

293 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:20:40 ]
インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって
感謝しながら使えよ

あと風呂でションベンするときはお風呂の神様ごめんなさい




294 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:56:28 ]
>>279
> void * は別の型にキャストできても
> 他の型からvoid* にはできないはずである。
逆だ。

295 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:48:15 ]
>>294
いやあってる。
char *p;
if ((p = malloc(sizeof(struct hoge))) == NULL)
とかけるのは >>279 があっている証拠

296 名前:デフォルトの名無しさん [2009/12/19(土) 19:14:04 ]
できる/できない、で言えば間違いだろ

297 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 19:39:58 ]
>>294-296
279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。

298 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:11:55 ]
>>297
あえて明示的にキャストすることでソースの可読性がうんたらかんたら



とかゴチャゴチャ言い出すぞきっと

299 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:23:48 ]
>>279
>void * は別の型にキャストできても
>他の型からvoid* にはできないはずである。

>他の型からvoid* にはできないはずである。
が、まさしく「自分は初心者です」ってアピールしてるんだよな。

300 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:33:43 ]
自分は初心者なはずである。

301 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:37:53 ]
ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。

12345678って書くか[12345678]って書くかの違いだけで。

302 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:49:04 ]
>>301
ポインタが int という仮定は例外が多い。

303 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:54:54 ]
>>301
ポインタは「整数型」への変換は保証されているが
「int」への変換は保証されていない。
(逆変換で戻したときに情報が失われる可能性がある)



304 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:17:28 ]
倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません
どこが間違っているのでしょうか

#include<stdio.h>
void baisuu(int y)
{
int b;
for(b=2;b<=20;b++)
{
if(y%b)
printf("%dの倍数です",b);
}
int main(void)
{
int x;
printf("整数を入力してください\n小数点以下は切り捨てます\n");
scanf("%d",&x);
baisuu(x);
return 0;
}

305 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:24:07 ]
>>304
!

306 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:30:07 ]
(無保証な)ヒント:
論理式に単項式だけを書くやり方
そう if( y % 3)とかwhile( !p )とか
はかっこいい
ように見えて実は
古くダサい
し、下らないミスの温床

if( (y % 3) != 0)とか
while( p != 0 )とか
書く癖のほうが類似書式のプログラミング言語(Javaとか)
も使うようになった時を考えるといい

307 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:31:00 ]
>>304
void baisuu(int y)にも}が足らん

308 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:37:54 ]
とりあえず>>306 >>307の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て
うまく倍数判定もできません

void baisuu(int y)
{
int b;
for(b=1;b<=20;b++)
{
if((y%b)=0)
printf("%dの倍数です\n",b);
}
}

309 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:42:51 ]
int a,shidt;
ととして
((a-shift)?(a-shift):2)
の演算でおかしな挙動するので調べてみたら
a-shiftがマイナスでも真と判定されてた
(((a-shift)>0)?(a-shift):2)
としたらちゃんと動いた
真と偽の動作を勘違いしてました


310 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:43:31 ]
>>308
それは代入だろ。

y % b == 0

311 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:45:36 ]
>>310
おお、ちゃんと動きました
=と==の違いを忘れてました

312 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:54:24 ]
意外と中級車も=と==を間違えるんだよなぁ
さすがに上級者はそんな間違いをする人はいなくなるが。

313 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:01:51 ]
代入演算子 = が悪い。
どうしてこうなったのか。

おかげで等価演算子は == という悲しさ。。



314 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:07:20 ]
比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ
面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく

315 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:22:54 ]
五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?

316 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:49:47 ]
>>314
pascal のように代入を := にし、比較は == にすれば公平でいいかも。

317 名前:デフォルトの名無しさん [2009/12/19(土) 23:02:43 ]
pascal が嫌いな人が作った言語でか

318 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:08:46 ]
=と==を間違えるなんて都市伝説だろ?
おれはめっちゃ初心者のときしか間違えてないよ。

319 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:19:27 ]
確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。
20年前は、
char *p, *q;
...
if (p = q) {...}
で、この = は間違ってないというような書き方が普通に行われていた。

320 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:29:35 ]
ソースは可能な限り短いほうがいい。

…みたいな考え方のアフォとは一緒に仕事したくないな。

321 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:33:07 ]
>>319
それは、今は警告でるし。

>>320
そういうのは状況によるとしかいいようがない。
「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。

322 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:35:15 ]
変数は可能な限り少ない方が良い。
繰返し回数は可能な限り少ない方が良い。

323 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:40:12 ]
>>319
30年前の間違いだろ。
20年前は既に警告出すコンパイラが主流だし
わかりやすさを優先することが当然になっていたよ。

まあ類は友を呼ぶというから
そういう人達の間ではそれが普通だったのかもしれんがね。



324 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:42:29 ]
>>320そういうひとって
printfもpfとかに名前をかえて

int a;
void f(){
pf("asdf");
}

こんなことしたがるような人?

325 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:43:27 ]
いや、それは論外すぎるだろ…

326 名前:デフォルトの名無しさん [2009/12/19(土) 23:48:26 ]
>>253です。
質問内容はコンパイルの出来ない理由を御聞きしました。
どうやら原因は全角スペースに問題があったみたいです。
回答してくれた方ありがとうございます。

327 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:49:58 ]
>>322
そういう考えでできたのが構造体やクラスや配列なんだろうな

int Taro_age;
int Taro_ID;
char* Taro_Name;
char* Taro_EmailAddress;

int Hanako_age;
int Hanako_ID;




みたいに一個一個作ってたら大変だし。

328 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:13:15 ]
int x;
int* p;
p=&x;
printf("%d",p);

この結果が毎回違うのはなぜ?
アドレス固定することはできないの?

329 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:17:15 ]
>>328
pに格納しているxのアドレスを表示している

330 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:20:13 ]
変数xが格納されているメモリの位置はOSが管理している

331 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:21:19 ]
int x;
int* p;
p=&x;
printf("%d",p);

int x;
int* p;
p=&x;
printf("%d",&x);

int x;
int* p;
p=&x;
printf("%d",*p);

int x;
int* p;
p=&x;
printf("%d",x);

332 名前:319 mailto:sage [2009/12/20(日) 00:28:57 ]
>>323
少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。
20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。
前のは例が悪かったけど、少なくとも当時は、
while (!(p = p->next)) { ... }
といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。

このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。

333 名前:デフォルトの名無しさん [2009/12/20(日) 00:32:26 ]
>>318
俺もそう思ってたが
先週 != を ! = と書いて
すっげー落ち込んだ



334 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:34:54 ]
警告ってなんなん?問題があるならエラーにしろや

335 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:35:38 ]
>>332
確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。

そもそもこの警告って、C言語の文法に違反してるとかじゃなくて
よくある間違いだから、って理由だしね



336 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:37:21 ]
int main()は値を返すべき

337 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:40:36 ]
>>330
プゲラ
トーシロは黙ってろよwww

338 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:41:56 ]
仮想メモリ。。

339 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:30:05 ]
>309

それは可読性を考えたらこっちがよくないか?


(( a > shift) ? (a-shift) : 2)

340 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:34:36 ]
>328

そのコードで&xの値が毎回同じになることを期待してはいけない。

自分でメモリ管理するのでなければ、変数やmallocの具体的な
値については、知らなくてイイし、依存するようなコードを書くべきではない。


341 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:45:17 ]
関数外でxを宣言してみたら

342 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:53:36 ]
せっかくCをやるんだからメモリのことは熟知したい

343 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:37:24 ]
初心者です。文字列のコピーについてです。

char a[10];
strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。
a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。

a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。
a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。

エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。
変換?「=」は代入を行っているわけではないのでしょうか?



344 名前:343 mailto:sage [2009/12/20(日) 02:38:14 ]
char a[10]; は char a[20]; にしてください。

345 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:45:40 ]
配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。


346 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 02:49:45 ]
"こんにちは"

347 名前:343 mailto:sage [2009/12/20(日) 02:58:26 ]
>>345
ありがとうございます。ですが難しく、頭の中で理解ができていません。
もう少し優しく教えていただけると助かるのですが・・・。

348 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:04:01 ]
char *a;
a = "こんにちわ";

349 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:17:27 ]
エラーメッセージをよく読みませう

350 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:19:20 ]
>>343
これを試してみ

char a[11];
a = "こんにちわ";

VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね
最初のうちは参考書をちゃんと見た方がいいよ

351 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:26:34 ]
a[10]が '\0' ってこと?

352 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 03:42:52 ]
>>347
配列と文字列リテラルは一緒じゃないよ。

文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。
確保されてない領域のアドレスを代入しても意味が無い。
配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。
アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。

353 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:06:47 ]
char a[20] = "こんにちわ";

char *p = "こんにちわ";
は全くの別物。



354 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:12:26 ]
将来的に
char a[20]="因習文法";
は禁止される予定

SJISとして
char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"],
4["一貫文法"],5["一貫文法"],};
てな感じしか許されなくなる可能性も示唆

355 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 04:13:32 ]
>>350
バカ?

356 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 05:08:58 ]
>>350>>355の1.1倍バカだね

357 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:20:56 ]
>>343
配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。

358 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:40:45 ]
だそうです!

359 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:41:09 ]
モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気
もちろん特点加算無し

360 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:59:15 ]
残機も無し

361 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:02:19 ]
あと数十年後
メモリが100GB、CPUの処理速度も今の数百倍とかになったら
C言語も変わるかなぁ

362 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 08:57:45 ]
>>350の言うようにしても>>343と同じ結果になるだけ。
>>350は文字列と配列をなんにも分かってない。

363 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:29:34 ]
>>361
そりゃスタイルは多少変化するだろうけど
コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず
新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う



364 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:45:20 ]
>>363
お前には言ってないからw

365 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:46:16 ]
>343

とりあえず、「配列には代入できないから」と思ってください。

正確には、配列は式の中では、「その先頭要素を指すポインタ」
として評価されるが、それは「代入できない左辺値」であるから。

ついでに(初期化付き)宣言と式では文法が別物になっている。

char a[20] = "hello";
はOK

char a[20];
a = "hello";
はNG


366 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:52:41 ]
>343

疑問の主旨とは変わるけど
strcpy_sだったら、そのコードコンパイル通らないんじゃないの?

CRT-Cだと思うから、こんなコードじゃね?
strcpy_s(a, sizeof(a), "hello");


367 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:55:14 ]
初期化付き宣言でややこしくなってるのだなぁ
と思う

368 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:02:38 ]
まあちょっと、誰もが一度は通る道だよな。
そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。

369 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:05:55 ]
>352

ちょっと説明が怪しいぞ。
Cの文法のイヤらしいところでわかりにくいのだけれどさ。

文字列リテラルの型はconst char[文字列長]で、普通は
書込不能な静的メモリ領域に置かれる。これは>343
でエラーになることとは直接関係ない。

「配列がポインタに成り下がるのは"右辺"のみ。」
はそんな感覚でよいと思うけど、正確には
「配列を評価すると代入できない左辺値となる」

char a[10];
a[0] = 1;

は左辺だけど、ポインタとして評価されている。

370 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:19:19 ]
メモリ管理は、いっぺん自分でやってみたほうがいい。
最近は大学でさえ教えないからな
俺のときはやったのに



371 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:29:46 ]
メモリ管理って?
Z80を使ったアセンブラ演習はした。
テンキーでマシン語入力して実行させるんだよな。
ステップ実行でメモリを観察しながら。

372 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:31:34 ]
言ってみれば、自分でOSを構築するってことだな

メモリ管理に留まらず、スレッディングやマネジメントも含まれる。

聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか


なもんで、リバースエンジニアリングすらも満足に出来ないと。
それできないとウィルスのリバースエンジニアリングも出来ない=検知できない
だからセキュリティ業界は人材の確保が大変だとよ

373 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:39:35 ]
アセンブラのみでBIOSを構築したり、OS作ったり
とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに
自分で何もかも構成した。売り物には、かなわないにしろな
HDDの制御やファイルシステムなども自分で考えて構成したりした。

普通大学つったらそういうことやるだろ
が、今は何かねむたいことを言ってやらないと。



374 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:53:00 ]
だから独り言なら他所でやれよ

375 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:20:43 ]
やだやだー

376 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:31:25 ]
char a[10]; の a の部分はラベルだとでも考えたら良い。


377 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:50:09 ]
ツェーの仕様上、アドレスの受け渡しは

明白に誰が何に使っているか分かってないものは渡せません!

っていうお約束がある。


「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」
状態である。そのソースを呼んだ感じで言えば。


「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、
コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。


それと、アドレスだけでは「どこからどこまでか」が分からないので
これも単純にやりとりするわけには行かんのである。
配列は長さが明白に分かってるポインタのようなものだから、
それが分からないポインタには単純に代入できない。

378 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 15:52:46 ]
          ___
         ξ _ ヽ
           ̄ ├-┤
    / ̄ ̄ ̄\)〆 |
    |       \ |
    ‐∩∩―┐   ||
     |・ ・   |   |│  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ┗ ^ ┛ |    | | <  ツェー!!!
    /777^l |    ||   \
    ) ̄ ̄_ノ__|   lヽl|     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ,―  ̄ ̄_η_|/V^  |
  l   ̄ ̄|_Ξ)/   |
  `‐―┬┘\/   |
      |        | 
      |  〇     | 
      |        |
      |__∧___|
      |   |   |    ∩ 
      |   |__|_ __ ∫ )
      |       \ ̄ ノ 
      `―┬‐―┬‐┘ ̄  
        /  /
      /  /
     /  /
,〜^⌒\__/

379 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:47:46 ]
byte* p=malloc(10000);
free(p);

これを行うと何がおこる?
mallocで確保した10000個の領域が全部開放されるの?

380 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:54:26 ]
連続したbyte10000個分の領域1つが解放される

381 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:59:09 ]
だよね。
じゃあbyte* p=malloc(10000);
ってのは悪いやりかた?

382 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:11:59 ]
何でそう思うの?
byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で

383 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:43 ]
つ「メモリリーク」
一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない
デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡



384 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:12:46 ]
って可変にしたけりゃrealloc使えばいい

385 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:15:48 ]
>>379-384
これこそ、なにがしたいのかわからん質問。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<137KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef