1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 14 pc11.2ch.net/test/read.cgi/tech/1181735298/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 91代目 pc11.2ch.net/test/read.cgi/tech/1182607405/
2 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:32:36 ] 過去スレ Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/ Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/ Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
3 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:55:44 ] └0^0┘ < これをグラディウスの後姿と書いた君!素晴らしい、そういう想像力はぼくちん好きだお♪ そういわれたら、なんかメガネじゃなくて後姿にしか見えなくなってきた。これが脳を刺激する アハッ体験なんだね、良い勉強になった。
4 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:03:17 ] ビッ○バイパーだろ
5 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:06:55 ] ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%87%E3%82%A3%E3%82%A6%E3%82%B9_ (%E3%82%B2%E3%83%BC%E3%83%A0) ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%91%E3%83%BC さすが、メガネデヴピッツァヲタは詳しいぜ、参ったぜベイベー。
6 名前:デフォルトの名無しさん [2007/06/25(月) 09:48:17 ] C言語なんですが 文字列の中の文字数を調べるstrlen()のように ファイルの中の文字数を調べる関数ってありますか?
7 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:00:22 ] 最後まで読もう pc11.2ch.net/test/read.cgi/tech/1170338926/585-
8 名前:デフォルトの名無しさん [2007/06/25(月) 10:44:15 ] OS:Linux 言語:c言語(posix準拠のC言語) socketについて質問です。 socketを生成して、 bindせずにrecvfrom(ブロッキング)した場合、 終了方法(recvfromのブロックを解除する方法)はどのような方法がありますか?
9 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 14:10:34 ] bmpファイルを読み書きするライブラリってありませんか? coconut.sys.eng.shizuoka.ac.jp/bmp/ ここのプログラムでは、なぜか画像が真ん中で切れて左右で入れ替わってしまいました。 AB→ABになってほしいところを、 AB→BAになってしまいました。
10 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 14:23:28 ] 読み初めの位置が半分ずれてるんじゃない?
11 名前:デフォルトの名無しさん [2007/06/25(月) 16:21:55 ] >>6 こんな感じかな unsigned NumLen() { unsigned c = 0,num=0; FILE *fp = fopen("text.txt","r"); while( (c = fgetc(fp)) != EOF) num++; return num; }
12 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:36:25 ] wcコマンドのソース見てそっからパクりゃいいんでねぇべか?
13 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 20:30:33 ] conio.hがないといわれました。 debian:~$ gcc ch05-04.c ch05-04.c:2:19: error: conio.h: そのようなファイルやディレクトリはありません はじめてconio.hというのを見ました。ちなみにconio.h というのは必要ですか? 独習cに下みたいなのがあったのですけど、これってgetchar でできますよね? #include <stdio.h> #include <conio.h> int main(void) { char mess[80]; int i; printf("input message (less than 80 letters)\n"); for(i=0; i<80; i++){ mess [i] = getche(); if(mess[i] == '\r')break; } printf("\n"); for(i=0;mess[i] != '\r' ;i++) printf("%c",mess[i] + 1); return 0; }
14 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 20:35:41 ] あ、できた。 conio.hの存在意義を教えてください。
15 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 20:41:00 ] コンソールI/Oはもっと色々できるのじゃよ
16 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:28:00 ] 登録後、即出会えた出会い系サイトのみを紹介するブログ始めました。 2chと併用して使える、良質な即日系サイトのみを薦めております。 ↓↓↓ 【ブログ】deaiload.blog109.fc2.com/
17 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:07:12 ] >>14 文字色変えたりとかもconio.hで出来るよ。8色しかなかったっけ? 別にconio.hでなくてもできるのあるだろうけど。標準ではもちろん無理。
18 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:34:43 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4382.txt 上のプログラムは、オセロを作ってるんですが 関数test2でswichの中のcase5がうまく実行されません そこで、どこまで実行できてるのか確かめるため printfを途中に入れてみたところ、何故かうまく実行できるようになってしまいましたw もちろん、printfをのけると、うまく実行してくれません。。。 一応動くので問題ないんですが、何故なんでしょうか?
19 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 00:46:41 ] ソースを見ずに回答すると、たぶんスタックを壊してる
20 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:30:28 ] >>18 test()で、x, yに対してノーチェックでx - 1などとしているので配列外を参照してしまっている。 ところで、いつからオセロは10x10になったんだ?
21 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:47:56 ] >>19 スタックの意味が分からないので調べ中。。 thx! >>20 thx 関数testを次のように改変しました。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4397.txt が、やっぱり実行してくれません>< 作ってる時に確か10×10ぐらいかな〜と思ったのでw
22 名前:18 mailto:sage [2007/06/26(火) 02:03:26 ] スタックというのは変数のエラーなんだろうか (違ったらスマソ) 確かに多次元配列を全ての関数に渡したりしてるけど printfを入れると解消する問題なので、原因は別かなと思います
23 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:09:03 ] >>22 スタックという変数を格納する場所の破壊
24 名前:18 mailto:sage [2007/06/26(火) 02:36:57 ] >>23 thx。。 どの部分がスタックを破壊しているのか教えて頂けませんか? もしくはスタックが破壊される原因を教えて下さい
25 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 03:38:40 ] スタックっていうか、そこかしこで配列外の領域にアクセスしてる気がするが。 とりあえず落ちるときの入力パターンぷりーず。
26 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 04:38:17 ] >>24 取り敢えずロジックをとばし読みして疑問に思ったところ 関数testの中で > if(array[x-1][y]==2){ //上 ってやってるところがあるけど、xは0になる可能性があるよね。 てことは配列の領域外を参照していることになるけど、これは大丈夫? 配列の添え字にy-1を与えているところも同様。 次に関数test2の中で > for(;y<=9;n++){ ってやってるところがある。でもyの初期値が設定されていないような気がする。 これだと(yに割り当てられた)スタックにたまたま積まれていた値の違いで動作が変わる可能性がある。 この辺の初期化してない変数なんかは言ってる問題が起きる典型的なパターンなんだけど。
27 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 04:39:54 ] あと質問には関係ない小さい点 void ai (int array[][10]) { srand(time(NULL)); array[rand() % 10][rand() % 10] = 2; } srandはここでやるべきではないと思う。mainの先頭で一度やれば十分というか、そうすべき。
28 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:21:22 ] ソース丸ごと投げて見てもらうと自分のダメなとこ突っ込んでもらえるんだな。 オレも今度投げてみよう。
29 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:29:13 ] ソースも出さない、エラーメッセージも正確に書かないよりは答えてもらえる確率は高くて当然だろ。
30 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:27:16 ] {1,2,3,....,n}の中から要素数がl以下になる組み合わせをすべて求めよ 例えばn=3,l=2のときは{0,1}{0,2}{0,3}{1,2}{1,3}{2,3}{1}{2}{3}となるようなものです お願いします
31 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:27:18 ] 阿部さんに○×を出すともれなく△□を突っ込んでもらえますよ?
32 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:35:12 ] >>30 課題は自分でやれ。な?
33 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:44:06 ] >>28 暇つぶししたいくらい暇なときには突っ込んであげるよ。
34 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:47:01 ] いやいやmainでsrandなんてしたら関数aiを知らない人は意味分からんじゃん やっぱり関数ai内に入れておくべき
35 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:47:27 ] >>34 妄言はそこまでにしとけ。
36 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:50:50 ] >>34 time(NULL) が返す値が、前回呼び出されたときと同じになるような、1秒以内に 連続して呼び出されるときは rand()が返すパターンが同じになるぞ。
37 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:52:38 ] >>36 フラグを入れるんだよ static int flag; if(flag==0){ srand(time(NULL)); flag = 1; } これでおk
38 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:53:25 ] >>37 先に言え、後だしで自分の落ち度を補って逃げるのは卑怯だぞ
39 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:56:31 ] ごめん
40 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:58:58 ] >>37 flagの最初の値は?呼び出されるたびに if(flag==0) を評価するの?無駄が多い。 mainで一度やっとけ。
41 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:59:26 ] >37 関数呼び出すたびに無駄なチェック入れんの?
42 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 07:03:35 ] >>37 他の関数でも同じことやるの? 有り得ないよね。
43 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 07:06:31 ] 乱数ってのは何度も初期化されないから乱数なんだよ。 初期化は一度のみ。 それを保証するには main で初期化するのが一番。
44 名前:18 mailto:sage [2007/06/26(火) 08:44:31 ] 寝てしまった。。 答えてくれた方、申し訳ない&thx! そ し て 問題点分かりました! >>26 の言うとおり、配列の要素が-になるのを回避、x,yを0で初期化したら 直りました!初期化しておかないと駄目なんだな! あと、srandはとりあえずmainでやっておきます!
45 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:54:36 ] 既に>20で指摘されている罠。
46 名前:18 mailto:sage [2007/06/26(火) 09:44:16 ] そこは、>>20 で変更したんですが、(case8が出来てないけど) 問題は、x,yの初期化という事です。
47 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:56:00 ] VisualC++ExpressEditionを使ってるんですが、 #include <stdio.h> main() { printf("私の名前は、山本一郎です\n"); } (名前はrei1_2)というプログラムをビルドすると、 ------ ビルド開始: プロジェクト: START_C, 構成: Debug Win32 ------ コンパイルしています... rei1_2.c リンクしています... rei1_2.obj : error LNK2005: _main は既に rei1_1.obj で定義されています。 C:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\Debug\START_C.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ビルドログは "file://c:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\START_C\Debug\BuildLog.htm" に保存されました。 START_C - エラー 2、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== というエラーが出てしまいます。 何所がおかしいのかよくわかりません。 教えてください。お願いします。
48 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:01:52 ] >>47 > _main は既に rei1_1.obj で定義されています そりゃだめだ。リンクさせないで別物のソースとしてコンパイルせい
49 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:05:32 ] rei1_1.c をどっか別の所に移動するか、 新しくプロジェクトを作るか。
50 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:15:37 ] 1を消さないんだったら同じソリューションで別プロジェクト作るのがいいかな
51 名前:47 mailto:sage [2007/06/26(火) 10:17:04 ] C:\Users\tokimaru\Documents\ って貼っちゃいましたけど、この情報から個人情報が割れたり、PCに侵入されたりしませんよね?
52 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:28:02 ] IP 分かんないから侵入とかは大丈夫だとは思うけど、あまり貼るべきではないな。
53 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:34:14 ] >>52 よかった〜(汗) ところで、48さん、49さん、50さんの言うようなやり方以外の方法ありますかね? 僕は初心者なのでよくわかりません。
54 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:39:48 ] >>53 だから他と被らない関数名にすりゃええやろ。
55 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:45:34 ] >>53 じゃあいったんプロジェクトから1を外せ 選択してDELキーで消える ファイルそのものは残るから、あとで既存の追加で戻せる
56 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:49:36 ] >>54 さん、>>55 さんありがとうございました。
57 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:18:18 ] typedef struct node* link; struct node { int item; link next; }; typedef link Node; link deleteNext(link x){ link t = x->next; x->next = t->next; return t; } link t=x->next; 新たなlink tを作り、tにxの指し示すリンクと同じitem,リンク先を持たせている x->next = t->next; xのリンク先はtが指し示すリンク先にする で合ってますか? だとしたらreturnでtだけ返すのだからx->nextを指定しても何の意味もないと思うのですが、何か記号の意味を履き違えている気がします
58 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:36:45 ] malloc も free もないんだが。 恐ろしいコードに見える。
59 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:46:36 ] >>57 関数の動きはこんな感じ。 ・xの指す先をtにコピー。xの指す先をtの指す先に変更。tを戻す。 つまり、リンクリストからxの指す先を外し、それを返している。 >>58 削除関数だからmalloc()は要らないわけだし、tを返すのは呼び出し元でfree()するためだろ。
60 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:48:24 ] >>57 link はポインタだから作るわけじゃないよ、アドレスを保存してるだけ。 A→B→C の状態を A→C に変えてる Bは宙に浮いてる状態で返してる。消すためだろう。
61 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:49:27 ] 書き換えるとこうなるのか。 -- link t = x->next; // 削除対象(へのポインタ)を一旦保存 x->next = x->next->next; // 削除対象を迂回するように接続しなおし return t; // 削除対象を返却
62 名前:デフォルトの名無しさん [2007/06/26(火) 13:03:00 ] feof()はファイルの終わりをどこで判定してるんでしょうか? 例、ファイルの中身が This is a pen の場合は、nに達した時点で0を返すのか、EOFで0を返すのか
63 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:05:15 ] やれば分かる。
64 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:10:09 ] 確かにこの程度なら実際に試してみるのが一番かもしれない
65 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:17:26 ] l = 0; while(!feof(fp)){ ch = fgetc(fp); printf("%c : %d \n",ch,ch); if(ferror(fp)){ printf("ファイルの読み込みエラー\n"); exit(1); } l++; } を実行してみたら-1も出力したのでEOFの次でループ終了ですかね
66 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:27:09 ] おいおい
67 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:28:43 ] 「EOF」 という言葉はどこを意図して使ってる?
68 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:29:31 ] -1じゃないんですか?
69 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:30:58 ] EOF を読み込んだら終了、だよね?
70 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:32:01 ] 意図しようとしてるのは同じことなんだろうか? ならいいんだけど。
71 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:32:23 ] EOFを読み込んだら終了ならEOFが出力されるのはおかしい
72 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:34:28 ] EOF を読み込んだら feof が真を返すようになるんだっしょ?
73 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:45:05 ] while(!feof(fp)) だからEOFに達した時点でループ終了してないとダメなんじゃないの?
74 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:46:16 ] EOF に達しはしたけど、読み込んではないよね?
75 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:46:58 ] 何か二人で同じことを言おうとしてる気がしてならない。
76 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:47:06 ] 実行すると-1返って来るよね 読み込んでるってことじゃないの?
77 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:48:29 ] とりあえずこんな感じだ。 #include <stdio.h> #include <ctype.h> int main() { int ch, b; FILE *fp = fopen("hoge.txt", "r"); if(fp == NULL) { return 1; } do { ch = fgetc(fp); b = feof(fp); printf("%c : %02X / %d\n", ch, ch, b); } while(!b); } T : 54 / 0 h : 68 / 0 i : 69 / 0 s : 73 / 0 : 20 / 0 i : 69 / 0 s : 73 / 0 : 20 / 0 a : 61 / 0 : 20 / 0 p : 70 / 0 e : 65 / 0 n : 6E / 0 ← n が読み込まれて、ファイルポインタは EOF に達しはしているが、まだ読み込んでないためそこが EOF かどうか分からないでいる ? : FFFFFFFF / 1 ← EOF が読み込まれたため、EOF に達した事が判明し、feof が真を返すようになる
78 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 13:50:58 ] >>76 -1 が返って来るのは、当然読み込んでるということ。 でも、その後にそれを表示してから、 その後にようやく feof をチェックしてるでしょ。 そっちのプログラムは。 で、そこでループが終了してる。 つまり、-1 が読み込まれた後に feof を実行すると 真を返すようになっている、ということだ。
79 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:01:32 ] fgetc()は、エラーとかファイルが終わってるとかで、読んだ文字がない時にEOFを返す。 「EOFを読み込んでいる」のではない。
80 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:03:01 ] 「0 個のりんごがある」 と 「りんごが 1 個もない」 程度の話だよ、それは。
81 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:10:27 ] feofはファイルの末端に来ました fgetcは読んだ文字がないので-1を返しました feofは真を返しました って話?
82 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:14:36 ] ファイルポインタは初めてファイルの末端に来ました feofは偽を返しました fgetcはもう読み込める文字がないので-1を返しました feofは真を返しました こうだな。
83 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:15:49 ] 初めて、は余計か。 ファイルポインタはファイルの末端に移動してきました feofは偽を返しました fgetcはもう読み込める文字がないので -1 を返しました feofは真を返しました こうか?
84 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:20:15 ] while(fgetc(fp) != EOF) の方がいいんじゃないの?
85 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:26:53 ] feof の挙動を調べたいみたいだよ。
86 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:27:59 ] 1文字ずつ読んだ場合に加えて、いっぺんに読んだときどうなるかも調べてみては
87 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:30:54 ] >>84 それは趣旨が違うと思った >feof()はファイルの終わりをどこで判定してるんでしょうか?
88 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 15:04:57 ] pthreadでデタッチスレッドを生成し、スレッドが終了した後に 仮想メモリが増えてしまいます。 #include <pthread.h> #define THREAD_COUNT 50 void *thread_func(void *arg); int main() { char command[128]; int i; pthread_t thread[THREAD_COUNT]; sprintf(command, "grep VmSize /proc/%d/status", getpid()); for (i = 0; i < 3; i++) { sleep(1); system(command); } for (i = 0; i < THREAD_COUNT; i++) { pthread_create(&thread[i], NULL, thread_func, &i); pthread_detach(thread[i]); } for (i = 0; i < 10; i++) { sleep(1); system(command); } return 0; }
89 名前:88続き mailto:sage [2007/06/26(火) 15:06:07 ] void *thread_func(void *arg) { sleep(3); } が動かしたソースで、実行結果が↓こんな感じです。 VmSize: 1392 kB VmSize: 1392 kB VmSize: 1392 kB VmSize: 410996 kB VmSize: 410996 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB VmSize: 42356 kB
90 名前:88続き mailto:sage [2007/06/26(火) 15:10:54 ] 色々調べたところ 410996kBは大体1392+8192kB×50(スレッド数) 42356kBは大体1392+8192kB×5 ぐらいになっているようでした。 8192kBはスタックサイズから来ているようで、スタックサイズを 変更してみたら仮想メモリサイズは変わりましたが、数式的には 上記と同じでした。 また、スレッド数を変えると410996kBのところがスレッド数に 応じた数に変わるのですが、最終的に落ち着く42356kBは 変わりませんでした。 増え続けることはないのでメモリリークとは違うと思うのですが 気にすることはないでしょうか。×5がどこから来ているのかとか どうも気になってしまって・・・ 何か分かりましたら教えてください。
91 名前:88続き mailto:sage [2007/06/26(火) 15:11:47 ] すいません。ちなみに開発環境はRedHat 9.0、gcc 3.2.2です。
92 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 15:36:15 ] 時間をずらして detach していった場合に 42356kB で止まるのだとしたら、 内部でいくつかの領域を確保したままにしてるのかも? 次にまた使うときのためにとか。 MacOSX 10.4.10 gcc 4.0.1 だと、 スレッド1つ分のサイズが残るみたいだ。
93 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 15:36:17 ] >>91 仮想メモリサイズの制限を越えたための拡張とかは?
94 名前:88続き mailto:sage [2007/06/26(火) 15:49:52 ] >>92 色々観察してみると、同時に実行されるスレッド数が1つの場合、 1392kB+8192kB×1くらいになって、スレッドが終了しても 減りませんが、何度スレッドを起動してもこれ以上増えることは ありません。 同時に実行されるスレッド数が5までの場合もこの傾向は同じ。 6を超えるとスレッド実行中の仮想メモリは増えるけど、スレッドが 終了すると5スレッド分の仮想メモリ量までは戻る、という 感じです。 5スレッド分は次回使いまわすために確保するようになってる んでしょうかね。 >>93 ulimit -a で見たら、仮想メモリはunlimitedに設定されて いました。
95 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:41:18 ] この脆弱性は文字列長の確認を適切に行わない strcpy()の呼び出しが原因 headlines.yahoo.co.jp/hl?a=20070626-00000024-inet-inet
96 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:50:55 ] >>95 あらら。
97 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:29:45 ] strcpyなんて使うなよ・・・
98 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:32:39 ] あっ、やっぱ問題があった、だから 使うなよ って後から言うのは卑怯。 さも知っていたかのようなことをいうやつに限って、そいつ自身が ありきたりのタブーをやらかしていることがある。
99 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:34:17 ] いやいやせめてstrncpy使うだろ 昔から問題は指摘されてたんだしさ
100 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:39:42 ] 単に文字列の整形ならsprintf()の方がいいと思う
101 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:10:14 ] ブラックジャック先生なら整形に失敗しないYO!