1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
175 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:41:14 ] 何故わざわざ構造体を……
176 名前:173 mailto:sage [2007/10/18(木) 20:42:23 ] まちがえたみたいね 無視してくださいw
177 名前:171 [2007/10/18(木) 20:48:12 ] >>172 できた〜〜〜ありがとうございます。 >>174 174さんのコピーして貼り付けたんですが、 コンパイルできませんでした。 初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが どうもありがとうです。
178 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:56:25 ] >>173 sizeof(int)==4なら 0x00FFFAは FA,FF,00,00 でしょIntel系なら。 00,00,FF,FA の順ががモトローラ系(スペル忘れちった)
179 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:21:57 ] エンディアンの違いはいい迷惑。
180 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:51:54 ] >>177 >>174 のヤツ。 psizeof→sizeofのタイプミス 2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。 ミス自体は初心者レベルのモンだな。 まぁどうでも良いけどな・・・
181 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:35:06 ] スタックとキューの初歩を勉強してるんですが。 #include <stdio.h> #define MAX_SIZE 30 int stack[MAX_SIZE]; int sp = 0; void push( int x ) { stack[sp] = x; sp++;} int pop(void) { int x; x = stack[sp-1]; sp--; return x;} 〜スタックが空か判定(省略)〜
182 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:36:16 ] void show( void ) { int i; printf( "size = %2d:", sp ); for( i = 0; i < sp; i++ ){ printf( " %4d", stack[i] ); } printf( "\n" ); } int main() { push( 1 ); show(); push( 2 ); show(); push( 3 ); show(); printf( "pop: %4d\n", pop() ); printf( "pop: %4d\n", pop() ); printf( "すべてpopします...\n" ); while( !is_empty() ){ printf( " %4d", pop() ); } return 0; } スタックの内容を少しずつ表示していくものなんですが、 これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。 ポインタとか使ったほうが良いんでしょうか? 危ない、の意味すらわかりません。分かる人居たら教えてください。
183 名前:デフォルトの名無しさん [2007/10/18(木) 22:39:55 ] すたっくはSTLつかっとけ
184 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:40:20 ] たぶんpushやpopする前にバッファが残ってるかチェックしてないからじゃね たとえばpushしてないのにいきなりpopするとか
185 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:44:34 ] しかし、STLはC++という罠。 >>181 ようするにMAX_SIZE以上pushしようとしたときと、 空の時にpopしようとしたときにまずい。
186 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:48:17 ] 「危ない、の意味」をボカしてるのは、自分で考えさせようという親心? なら俺も黙っとく。
187 名前:デフォルトの名無しさん [2007/10/18(木) 22:48:19 ] >>181 ,182 pushする時にはオーバーフローしないか(配列から溢れないか)、 popの時にはスタックが空でないかチェックするのは鉄則 pushなら if(sp < MAX_SIZE) popなら if(sp > 0)でチェックすればいい
188 名前:186 mailto:sage [2007/10/18(木) 22:50:08 ] (´д`;)
189 名前:181 mailto:sage [2007/10/18(木) 22:58:36 ] 皆さんありがとうございます。 危ない、ってそれのことだったんですね。 push関数で最大値以上にpushしたらどうなるのか、エラー出てないし まあ良いかと思ってたんですが、油断していました。 (181の最後で「空かどうか判定」の部分は省略しましたが、 そこのことだと思ってました。) 自分でちょっと直してみます。
190 名前:デフォルトの名無しさん [2007/10/19(金) 06:02:19 ] #include<stdio.h> int main(){ char *str="test"; str[1]='s'; printf("%s\n",str); return 0; } これを試してみたのですが、何も表示されません。 どこが問題なのでしょうか?
191 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:10:36 ] 釣りにしか見えない
192 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:27:51 ] >>190 ポインタや配列に関する知識が中途半端な証拠
193 名前:デフォルトの名無しさん [2007/10/19(金) 06:37:35 ] char str[]="test";
194 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:42:43 ] >>190 それは処理系によって動作が異なる。 何も表示されないどころかエラー吐いて止まる場合もあるし、 >>190 の望みと思われるtsstを表示して正常終了する場合もある。 つまり、コンパイルできるからといって書いてはいけないコード。
195 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:43:49 ] 明らかに欠陥だな
196 名前:デフォルトの名無しさん [2007/10/19(金) 06:45:17 ] でも、とりあえずstr[1]='s'をコメントアウトして printf("%c",str); とした場合には、ちゃんとeが表示されます。 これってつまりstr[1]には文字が入っているということですよね。 では何故そこに代入することができないのでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 06:59:28 ] >では何故そこに代入することができないのでしょうか? そこってどこだと思う?
198 名前:デフォルトの名無しさん [2007/10/19(金) 07:11:28 ] 文字列の先頭アドレスからsizeof(char)一つ分進んだ所ではないのですか? そこにsを代入しようと思うのですが。
199 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 07:26:45 ] とあるビルの2階に手紙を届けたいが届けることが出来ない。なぜだろう? →そのビルへは階数に関わらず手紙を届ける事が禁止されている
200 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 07:32:38 ] こういう回りくどく説明してるのは傍から見てうざい
201 名前:デフォルトの名無しさん [2007/10/19(金) 07:34:31 ] ポインタに代入した文字列はconstなんですか?では何故コンパイルエラーが出ないのでしょう? 出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。
202 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:46:11 ] 文法的に正しくても配列のメモリ格納形式が処理系異存だから うまくいかない環境もあり,うまくいく環境もある
203 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 08:48:31 ] >>201 配列とポインタが同じように扱える保証はないからな
204 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 10:52:15 ] プログラムの勉強を始めようと思って、分りやすい教科書を 探しているんですが、何かおすすめの本てありますか? 今手元にあるのはメディックエンジニアリングの「これから はじめるC言語基礎の基礎」という本なんですが・・・・
205 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 10:58:28 ] nai
206 名前:デフォルトの名無しさん [2007/10/19(金) 11:50:24 ] >>202-203 いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね? 配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。 いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、 なんてトリッキーなことはしていないと思うのですが、しているのですか? もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?
207 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:04:51 ] >>206 文字列リテラルと配列の区別をつけよう。
208 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:05:18 ] とりあえずさ、 >>190 のコードで実際にどんな値が入ってるか、確認してみれば? printf("%d" , str[1]); %cじゃなく%dで もし代入失敗してるなら代わりに何が入ってるか確認できるし
209 名前:デフォルトの名無しさん [2007/10/19(金) 12:12:01 ] >>207 機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう? 単に不便にしているだけとしか思えないのですが。 >>208 同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。 しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…
210 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:27:50 ] 無駄じゃないだろ
211 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:30:35 ] >>209 「このモジュールはデバッグモードでコンパイルして こっちはリリースモードでコンパイルしないとダメだからな」 嫌すぎる…
212 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:22:06 ] >>209 文字列リテラルを使うときに、メモリを節約できるから。 つまり、次のコードは、同じ値を出力するかもしれない。 # コンパイラとオプションによって変わる -- void exsample() { const char * foo = "abcde"; const char * bar = "abcde"; printf("%p, %p\n", foo, bar); } -- 勿論、次のコードは只の配列だから違う値が出力される。 void exsample2() { char foo[] = "abcde"; char bar[] = "abcde"; printf("%p, %p\n", foo, bar); }
213 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:23:23 ] げ、どうでもいいけど関数名がtypoだ _/ ̄|◯
214 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:29:26 ] 自分が間違ってんのに仕様の方に文句をつけるやつは、Cどころか学習自体に向いてないよ
215 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:56:58 ] 新しい言語作ればいいと思うよ
216 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 15:42:13 ] #include <stdio.h> int main (void){ double a,b,c,x; printf("Please type 1st Number >> "); scanf("%xf",&a); printf("Please type 2nd Number >> "); scanf("%xf",&b); printf("Please type 3rd Number >> "); scanf("%xf",&c); x=(a+b+c)/3; printf("Average = %xf\n",x); return 0; } なぜか、計算結果が違う・・・ %f が違うんでしょうか?
217 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 15:46:25 ] >>216 %xf を %lf にしてみたらどうかな?
218 名前:215 mailto:sage [2007/10/19(金) 16:07:13 ] >216 ありがとうございました。
219 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 20:17:42 ] >>201 文字列リテラルの内容を書き替えるプログラムの挙動は未定義。 文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。 蛇足だがC++ではconst charの配列となっている。 (ただし、またも互換性のためchar*への型変換は定義さらている) >>206 組み込みではROMに配置できるようになる。 Windowsなど高水準なOSでは、規格の規定から 文字列リテラルの書換はするべきでないと 認知されているため、文字列リテラルが 格納されている辺りを読取専用にする。
220 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 21:09:41 ] まぁ結局ROMに配置すんのもメモリの節約だし、 「メモリの節約のため」でまとめちゃってもいい気もするけどね。 なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、 後学のために教えたって欲しいかも。
221 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 21:39:11 ] まぁROMは遅いから結局実行時にRAMにコピーしちゃったりるすんだけどね
222 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 22:18:08 ] 開いたりしていないファイルポインタを fclose(fp); とすると、どうなるのでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 22:21:13 ] fclose関数でエラーが返されると思います。
224 名前:デフォルトの名無しさん [2007/10/20(土) 12:19:02 ] >>222 詳しく言うと、エラー時にはEOFが返される。 成功時は0が返される。
225 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:31:04 ] その前に開いてない fp ってどっから持ってくるんだ NULLかゴミ値じゃねぇの?
226 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:47:34 ] FreeBSD系だとfcloseにNULLを渡したら例外が起きるらしい。 以下はMac OS X Tigerのfclose(3)から引用 > The fclose() function does not handle NULL arguments; they will result in > a segmentation violation. This is intentional - it makes it easier to > make sure programs written under FreeBSD are bug free. This behaviour is > an implementation detail, and programs should not rely upon it. 実際にfcloseにNULLを渡してみたらsegvが発生した。 おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…
227 名前:デフォルトの名無しさん [2007/10/20(土) 18:16:47 ] 例えば const char test[] = {"abcdef"}; で cとdの間に0x04を入れたい場合どう書けばよいのでしょうか
228 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:31:08 ] "abc\x04def"
229 名前:227 [2007/10/20(土) 18:42:47 ] 了解
230 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:12:41 ] "abc\04def"とも書けなっかったかな。 \04は8進表記。
231 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:04:00 ] doble型の変数をprintfで表示するときには整数で表示するにはどうしたらいいですか?
232 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:08:21 ] double x = 1; printf("%d\n", (int)x); こうか?
233 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:08:42 ] >>231 %.0f
234 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:09:56 ] >>232 >>233 どちらでもできました!ありがとうございました
235 名前:デフォルトの名無しさん [2007/10/20(土) 20:30:34 ] 今までCとC++は同じものだと思っていたけれど、 MFCを使ったC++プログラミングは、C言語と似ているようで 似ていないですね。
236 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:36:52 ] C++はCの拡張だから、Cと同じように書くこともできる 単にC++をCとして使ってただけだろ
237 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:37:27 ] BetterC
238 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:40:47 ] CとC++は全然違う言語だと思ってもいいよ クラス、例外処理、テンプレート、新たに覚えることはたくさんある
239 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 21:02:21 ] >>238 の言うとおり、別物と認識した方がいい。 同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。
240 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:10:59 ] 引数の数が可変の関数の作り方を勉強したのだが、 printfって、%fでdouble型もfloat型も受けるよな? それが、よく分らなくなった。 double型とfloat型って、サイズが違うはずだから、 引数から取り出すとき、区別がつかなくて、おかしくならないか?
241 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:13:34 ] www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい
242 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:13:52 ] 可変引数では int以下→int、float→double になる
243 名前:デフォルトの名無しさん [2007/10/20(土) 23:50:12 ] >>240 でもそういうのってコンパイラによって違うのでは? それってANSI Cで決められてたっけ?
244 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:07:10 ] >>243 ANSIというか規格で決まっている。 floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。 これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。 なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。 似たようなことがcharにも言えて、これはintに格上げされる。
245 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:21:25 ] ちょっと聞きたいんだけど #include "myheader.h" int main(){ int list_num[100]; FILE *fp; int i; char buf[100][30]; というプログラムの最初の部分において gcc -c main.c main.c: 関数 `fgword' 内: main.c:3: error: 文法エラー before '{' token main.c:9: error: 文法エラー before "fp" make: *** [main.o] エラー 1 main関数内でいきなりこういうエラーがでるんだけど どういうことなんでしょうか? main関数内にfgwordは使ってないんですけど
246 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:22:49 ] たぶん myheader.h の中がおかしい
247 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 01:35:24 ] myheader.hの中身のプロトタイプの int fgword(int); にセミコロンがなかったからこういうエラーがでたようです。 ありがとうございます。 突然こんなエラーでてきてびびった。
248 名前:デフォルトの名無しさん [2007/10/21(日) 03:41:30 ] デスクトップパソコンで 処理させるのと ノートパソコンで処理 させるのと 音が違うな。 デスクトップはうるさくてやってられない。 実行に10分くらいかかるプログラムを動かしてるとき デスクトップだとかなり沸いてくるし。
249 名前:デフォルトの名無しさん mailto:age [2007/10/21(日) 03:45:40 ] videointroplayer.web.fc2.com/v.htm?ii9YN1kO-TK36%+8mdKsm-z3pn32%+WhqyiIrhz0F110%+iwCjWdz0Gid150%+Kjtps4byn7a119%+@1@_%E4%BC%9A%E9%95%B7%E7%89%A9%E8%AA%9E
250 名前:デフォルトの名無しさん [2007/10/21(日) 12:38:50 ] 1bitのファイルはつくれるんでしょうか? charだと8bitになってしまいます
251 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 12:39:12 ] char* ch; ch = "test1"; ch = "test2"; ↑で"test2"を代入した時点でメモリリークしてますか?
252 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 13:11:01 ] >>251 メモリリークの意味を考えてください 確保したメモリを使用後も開放せずにいることですよ で、それは該当すると思いますか? そもそも領域確保していないのに
253 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 13:13:03 ] >>251 「動的に」が抜けてた 静的に確保されたものは終了後、自動的に開放されます
254 名前:デフォルトの名無しさん [2007/10/21(日) 13:59:07 ] スレッドが開始される前に、mainで全ての処理を終えてしまうようです そのためスレッド稼働中の判定がうまくいきません どうしたらいいですか? #include <process.h> #include <stdio.h> #include <windows.h> void fnc(void *p){ int m=(int) p; Sleep(m*400); printf("%d end\n",m);} main(){ HANDLE m[10]; DWORD tp[10]; int n=0,k; for(k=0;k<10;k++)tp[k]=0;k=0; while(n<100){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE){ m[k]=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, (void *)n));n++;} k++;} Sleep(10000);}
255 名前:254 [2007/10/21(日) 14:04:27 ] まちがえました
256 名前:254 [2007/10/21(日) 14:11:11 ] HANDLE m; DWORD flg; m=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, NULL)); このようにスレッドを開始したとき、スレッドが終わると次の関数を終了コードを返すはずですよね? GetExitCodeThread(m, &flg); なんかいつまでもアクティブのままなんですが
257 名前:254 [2007/10/21(日) 14:18:10 ] _beginthreadは終了しても終了コード返しませんか?
258 名前:デフォルトの名無しさん [2007/10/21(日) 14:20:02 ] なんかクリエイトスレッドは、不都合があるってかいてあったんですけどこっちのほうがいいですか?
259 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 14:29:28 ] msdn2.microsoft.com/ja-jp/library/kdzttdcb (VS.80).aspx >start_address で起動されるルーチンは、__cdecl 呼び出し規約を使用する必要があり、戻り値を持つことはできません。
260 名前:デフォルトの名無しさん [2007/10/21(日) 14:36:49 ] _beginthreadexを使ったらうまくいきました
261 名前:デフォルトの名無しさん [2007/10/21(日) 14:56:09 ] 質問なんですけど、全てのスレッドが終了したら停止したいんですけど、最後の部分の判定は駄目なんでしょうか? なんか作業が終わる前に停止してしまいます #include <process.h> #include <stdio.h> #include <windows.h> #define ThreadNum 100 unsigned __stdcall fnc(void* p){ int m=(int) p; Sleep((m%10)*10); printf("%d end\n",m);} main(){ HANDLE m[ThreadNum]; DWORD tp[ThreadNum]; int n=0,k; for(k=0;k<ThreadNum;k++)tp[k]=100;k=0; while(n<100){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE){ m[k]=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL));n++;} k++;if(k>=ThreadNum)k=0;} do{n=0; for(k=0;k<ThreadNum;k++){ GetExitCodeThread(m[k], &tp[k]); if(tp[k]!= STILL_ACTIVE)n++;} }while(n>=ThreadNum); }
262 名前:デフォルトの名無しさん [2007/10/21(日) 14:57:22 ] すべてのスレッドがアクティブでは無いとすれば、作業が全てすんでいると思うのですが
263 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 14:57:52 ] いい加減スレ違いだって気づけ
264 名前:デフォルトの名無しさん [2007/10/21(日) 14:58:41 ] すみません 解決しました 一番最後は while(n<ThreadNum); でした
265 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:19:53 ] 停止を待つなら for(n=0; n<ThreadNum; n++) { if(m[n]) WaitForSingleObject(m[n], INFINITE); } というかreinterpret_castってC++じゃねーかww
266 名前:デフォルトの名無しさん [2007/10/21(日) 15:30:27 ] >>265 それはEXではない方の場合でしょうか?
267 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:34:46 ] マルチスレッドという時点でVisual C++依存 よってCの範疇ではないのでスレ違い
268 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:46:23 ] マルチスレッドなんて素人が無理に使うもんじゃないよ。
269 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:16:06 ] こういう簡単なポインタに関するプログラムがあるんですが、 実行するマシンによって(無論コンパイルはそのコンピュータ上でやり直している) 値が変動したりしなかったりします。 どうしてでしょうか? --------------------------------------------------- #include <stdio.h> main(){ int i,*x; x=&i; *x=1; printf("x=%o *x=%d\n",x,*x); } --------------------------------------------------- コンパイルコマンドは gcc hoge.c 以下は4回分の出力を横に並べたもの Fedora7 x=27775464634 *x=1, x=27747676054 *x=1, x=27773760474 *x=1, x=27764163514 *x=1 Vine x=27767545704 *x=1, x=27770645104 *x=1, x=27777542624 *x=1, x=27775054324 *x=1 OS X(10.3) x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1 HP-UX x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1
270 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:19:54 ] *xの値が変わってないんならどうでもいいことじゃね?
271 名前:デフォルトの名無しさん [2007/10/21(日) 16:21:56 ] OSのメモリ管理法にもよるだろ。
272 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:24:15 ] >>269 xは変数iのアドレス(スタック上の) OSによって異なるだろうし、同じOSでもコンパイラによっても異なる
273 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:27:19 ] 質問があるんですが int input(char *pstr1) { char *ppstr1; fgets(pstr1,SIZE_ARR,stdin); fflush(stdin); ppstr1=strchr(pstr1,'\n'); if(ppstr1!=NULL){ *ppstr1='\0';} return 0; } このコードは、fgets関数で読み込んだ文字列から改行記号を探し ヌル文字と改行文字を入れ替えをするということをしてるんですが 「*ppstr1='\0';」は、なぜ間接演算子抜きの「ppstr1='\0';」ではダメなんでしょうか ご教示ください
274 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:30:24 ] >>270-272 なるほど、ありがとうございました。
275 名前:デフォルトの名無しさん [2007/10/21(日) 16:39:43 ] >>273 strchrは見つかった場所へのポインタを返すから、char *型のppstr1で受け取ってるだろ? char *型、つまりアドレスを表してるわけだから、ppstr1だけだと、その見つかった場所のアドレスになるんだ。 だから、アドレスを書き換えても意味がない。 ここでやりたいのは改行をヌル文字に変える作業だから、ppstr1というポインタを介して値を変更しないといけない。 だから、間接参照演算子を使って代入作業を行わないと駄目ってこと。