トップページ⇒tech
1001コメント325KB

【初心者歓迎】C/C++室 Ver.72【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/05(金) 16:51:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0558デフォルトの名無しさん2010/04/30(金) 05:42:32
あと、何度もすいません、
test.c:2: error: 'for' loop initial declaration used outside C99 mode
test.c:3: error: 'for' loop initial declaration used outside C99 mode
ってエラーがでてコンパイルできなくなりました…
0559デフォルトの名無しさん2010/04/30(金) 05:47:09
>>558は事故解決しました
0560デフォルトの名無しさん2010/04/30(金) 06:29:28
関数が長くなったり、処理が複雑になってきたときに
int i; /* i を外で宣言したら */
for (i = 0...

i = 5; /* ループカウンタ以外で i を使ったりすると管理が面倒 */

string::iterator i; /* 同じ識別子を宣言できない */

とかの状況を回避する。
要するにコードの保守性を上げるため。
グローバル変数多用しない、とかも同じ理由。
0561デフォルトの名無しさん2010/04/30(金) 06:53:02
>>560
つまりコードの上のほうでループ用にiつかって、
おそらくそのデータはそのループのカウント用にしか使わないなと思ったら
次の場所でiを再び使うこともある、そのブロック内で宣言しておけばOKってことですか?(最初に宣言してるとだめ?)
0562デフォルトの名無しさん2010/04/30(金) 09:39:00
>>561
ちょっと解釈は変かな。
本来、関数内で違う目的に同じ名前の変数を使うのは設計が悪い。
但し、ループ制御変数みたいに同じ*ような*目的に一々違う名前を使う習慣がない場合もある。
そんなとき、次のループで前のループ制御変数をそのまま使うと問題がある*かもしれない*し、ループだけ移動するかもしれない。
だったら有効範囲を限定してしまえば宣言を遠くまで探しに行かなくて済むし、影響を心配することもなくなるということ。
但し、古いCではブロックの途中での宣言ができないことと問題のfor文内での宣言ができないことに注意。
--
void func(int a)
{
int b = a; // ブロックの先頭なので問題なし
if (a == 0) return;
int c = a; // ブロックの先頭ではなくif文の後なので古いCではエラー
{
int d = a; // ここはブロックの先頭なので問題なし
for (int i = 0; i < a; ++i) { // for文内での宣言は古いCではエラー
int e = a; // ここもブロックの先頭なので問題なし
}
for (d = 0; d < a; ++d) ; // これは当然、問題なし
}
--
>>560
グローバル変数を極力使用しないのは、有効範囲を限定する目的以外にも名前を公開しないと言う目的もあることに注意。
0563デフォルトの名無しさん2010/04/30(金) 15:09:02
横から質問失礼
グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz
0564デフォルトの名無しさん2010/04/30(金) 15:54:23
>>563
やむなく使う状況が分からない、なぜならグローバル変数を使ったことがないから、なら筋が通るんだけど
頻繁に今使ってるのであれば、それを極力減らすように努力してみてはいかがか
0565デフォルトの名無しさん2010/04/30(金) 16:01:47
>>563
グローバル変数を使うと何が便利だと思う? その裏返しで、便利さ故の厄介な目に遭いたくないから使いたくないのよ。
0566デフォルトの名無しさん2010/04/30(金) 16:14:30
それはグローバル変数のデメリットなわけで、やむなく使う状況の説明になっていません
0567デフォルトの名無しさん2010/04/30(金) 16:16:17
あと、微妙な問題だけど、
1.for内で宣言
これコンパイルとおらない環境あるから。。
for(int i...){}
for(int i...){}
とやるとiの多重宣言だといわれるのがVC6
0568デフォルトの名無しさん2010/04/30(金) 16:26:14
>>567
今更そんな過渡期のコンパイラなんて無視していいでしょ。
今後サポートされているOSではVC6自体がサポートされないのだから。

>>566
已む無く使う状況は、その状況になれば判ります。
逆に言えば、そうならない限り無視して構いません。
0569デフォルトの名無しさん2010/04/30(金) 16:33:38
学校の環境がそれであることが十分ありうることは宿題スレを見てると実感できるよ。
あと、業務でも出会う可能性もあって、VC6でビルドできないとリリースさせてもらえない現場があった。
まあ、捨てちゃいなよ、とは思うんだけどさ。。
0570デフォルトの名無しさん2010/04/30(金) 17:29:43
>>567
YOU! #define for if (false); else for しちゃいなYO!
0571デフォルトの名無しさん2010/04/30(金) 19:54:37
563です。亀レス失礼
自分は趣味の域なんで大きいサイズを扱わないからってのが
グローバルの怖さがわからない一番大きな要因だと思います
とりあえず今後は減らす方向で色々やってくことにします

>>564
世間一般的にはグローバルは「やむなく」使うのかなと
自分はやむなくと言うより結構頻繁に使ってたもので
ややこしい文面で申し訳ない

いずれにせよ勉強あるのみってことで
0572デフォルトの名無しさん2010/04/30(金) 20:12:41
おまえみたいなやつは一番信用ならんので,
プログラマにならないでください
0573デフォルトの名無しさん2010/04/30(金) 20:14:56
>>570
上を説得する気もなかったのでそれやらないまま任務遂行したYO!
0574デフォルトの名無しさん2010/04/30(金) 20:17:45
>>571
ああ、なるほど。
自分が神様ですべてを把握できているのなら、グローバル祭りでも特に困らないままだよ。
というのは、複数人が触る、または他人のコードをメンテするときに困ることが多いから。
0575デフォルトの名無しさん2010/04/30(金) 20:28:48
グローバル変数のよくない理由はみんな分かってるし、それでも
メリットを見出して使うんだから、基本的にはどんどん使っていい

2chとかの頭でっかちは、グローバル変数ときいただけでとにかくダメって
わめくけど、気にする必要はない。そういう奴に限って、10個も20個も引数のある
関数作って、グローバル変数使ってないからって理由でドヤ顔だったりする
0576デフォルトの名無しさん2010/04/30(金) 20:43:00
とにかくグローバル変数はダメだろ。
0577デフォルトの名無しさん2010/04/30(金) 20:46:14
異なる翻訳単位におけるローカルでない静的オブジェクトの
初期化の順番は不定である。

っていうことは皆さん 分かっていて話をしているの?

それともこのスレの半分くらいは
まさかこれを知らないで話をしているわけではないよね?
0578デフォルトの名無しさん2010/04/30(金) 20:46:43
>>572
苦労したんだね(´;ω;`)ブワッ
0579デフォルトの名無しさん2010/04/30(金) 20:49:49
>>577
とりあえず >>575 あたりは知らないまま自信満々になってると思うw
0580デフォルトの名無しさん2010/04/30(金) 20:51:53
>>575
限ってといっても大半の人がグローバル否定派なんだから、その例は極端すぎ
0581デフォルトの名無しさん2010/04/30(金) 20:54:32
引数10個も20個もいるような内容ならクラスなり構造体使うだろjk
>>575 は何を言っているんだ。頭悪いのか
0582デフォルトの名無しさん2010/04/30(金) 20:56:15
本当にグローバル変数は使ったことがない。
(引数が8個以上の関数も定義したことがない)

どうしても必要な場合のみSingletonパターンか
関数ローカルなstatic変数を返すようにしてる。
0583デフォルトの名無しさん2010/04/30(金) 21:02:02
シングルトンパターンが確立している以上、グローバルはまったく使わないな。
0584デフォルトの名無しさん2010/04/30(金) 21:08:23
どうせ,571はクラス設計より,動かすことを優先してつくってる.

趣味レベルであるにもかかわらず,
そこをバランスよく出来ないあたり,センスがかけている.

さらにそれが仕事になったとき,
締め切りにおわれて痛いコードを量産することは目に見えてる.
0585デフォルトの名無しさん2010/04/30(金) 21:13:09
屈折した思い込みや妄想はその辺で。 思い込み激しいとデバッグ能力下がるぞ
0586デフォルトの名無しさん2010/04/30(金) 21:36:29
>>575
> 10個も20個も引数のある
> 関数作って、グローバル変数使ってないからって
> 理由でドヤ顔だったりする
どういうシチュエーションなのか全く伝わらないのに
PCの向こうでドヤ顔してそうな気がするのは俺だけではあるまい。
0587デフォルトの名無しさん2010/04/30(金) 21:37:34
>>582
それは大袈裟だろ。
俺だってこのウン年で使った事ないけど、
初心者の頃は使った事あるよ。

グローバル変数を人生で一度も使わないC/C++プログラマは
居ないだろ。
0588デフォルトの名無しさん2010/04/30(金) 21:43:17
>>587
そりゃ人生単位で括れば使ったことはあるさ。
厳密には「現在も活用したり保守したり、あるいはテストや学習目的を含めて、少なくとも手元に残してるコードの中では」
使ったことがないと言えばいいか?w
0589デフォルトの名無しさん2010/04/30(金) 22:30:13
なんか知らんがここが【初心者歓迎】ではないことだけは良く分かったw
0590デフォルトの名無しさん2010/04/30(金) 22:33:19
初心者歓迎だからこそ、「グローバルを基本的にはどんどん使っていい」なんてことは言ってはいけないだろうにと言いたいんだろうよ。
0591デフォルトの名無しさん2010/04/30(金) 22:38:21
プログラムすんなとかセンスがないとかそれを初心者に言ってどーすんだって
キモイ発言が目立つんだけど
0592デフォルトの名無しさん2010/04/30(金) 23:10:01
一部が目立つのなんて2ちゃんじゃ良くある事
でもそれがイコールで全体の意見なんて事は無いだろ
0593デフォルトの名無しさん2010/04/30(金) 23:21:05
そう言うのはどこにでもいる
そう言うのはどこでも基本スルー
0594デフォルトの名無しさん2010/04/30(金) 23:21:05
画面の向こうの敵に負け・厭気を植え付けられん程度の機知で中途半端に批判するくらいなら

黙ってろ
0595デフォルトの名無しさん2010/04/30(金) 23:52:15
test(kakikomi());
0596デフォルトの名無しさん2010/05/01(土) 00:26:57
たしかにそーだね
ベテラン同士で無知だどうだと殺り合うのはいいが
素人狙い撃ちするキモイのがいるなってことが言いたかった
ま、スルーだね
0597デフォルトの名無しさん2010/05/01(土) 00:40:59
ベテラン同士で無知だどうだとやりあうニアイコール罵り合うのは不毛
素人狙い撃ちするキモイのがいるのは同意
0598デフォルトの名無しさん2010/05/01(土) 01:52:13
VC++ 2008 Express edition で timeGetTime() を使おうと思って
とりあえずmmsystem.hをインクルードした以下のようなコードを書きました。

#include <mmsystem.h>
using namespace std;
int main()
{
}

これをコンパイルしただけで大量のコンパイルエラーが出ます。
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C2146: 構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\mmsystem.h(103) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
・・・・・・

何か根本的に設定が不足しているのでしょうか?
0599デフォルトの名無しさん2010/05/01(土) 01:56:10
>>598
#include<windows.h>
にすればいいと思うよ
0600デフォルトの名無しさん2010/05/01(土) 01:56:15
#include <windows.h>
#include <mmsystem.h>

ググったらすぐ出てきたぞ。
06015982010/05/01(土) 02:00:59
>>599
>>600
ありがとうございます!

mmsystem.hはwindows.hが必要なのに内部でincludeしていない。
でも>>600みたいに実際に使うところで一緒に書くと上手くいく。
これはどういうことなのでしょうか?
0602デフォルトの名無しさん2010/05/01(土) 02:03:37
>>601
windows.h をインクルードすればいいようにできている
mmsystem.h みたいなのは直接使っちゃダメ
0603デフォルトの名無しさん2010/05/01(土) 06:36:51
forの中に(ループ変数以外に)変数を用意する場合、最初に一度初期化したい場合はforの外側に書いてやるしかないですか?
できればforの中だけに出てくるようにしたいんですが
0604デフォルトの名無しさん2010/05/01(土) 06:57:48
{ /* スコープを限定したいなら、ブロックで囲んで */
    /* 普通にループの外(ブロック内)で定義してやるのが定石かな */
    std::vector<int> v(100, 100);
    for (std::vector<int>::iterator i = v.begin(), last = v.end(); i != last; ++i) {
        *i *= 2;
    }
}
0605デフォルトの名無しさん2010/05/01(土) 06:58:17
for(int i=0,tagprm=reinterpret_cast<int>(&PRM(0,0));i<N;++i){
PRM &prm = &reinterpret_cast<PRM*>(tagprm);
0606デフォルトの名無しさん2010/05/01(土) 07:16:06
>>605
邪悪なコードを吹き込むなw
というかいろいろ間違いすぎ
0607デフォルトの名無しさん2010/05/01(土) 11:51:06
#include <stdio.h>

int main(void){

char *str ="Hello";

printf("%s", str);

return 0;
}

これでなんでHelloが出てくるのか分りません
strはポインタですよね?
アドレスが入るんですよね?
じゃあ*strとしないと中身は出てこないんじゃないでしょうか?
0608デフォルトの名無しさん2010/05/01(土) 11:58:14
%sが必要とするのは文字列の先頭を指すポインタ
0609デフォルトの名無しさん2010/05/01(土) 12:01:57
*strで出てくるのは'H'だよ
0610デフォルトの名無しさん2010/05/01(土) 12:14:23
>>607
そのコードをもっと分かり易く(分かり難く?)書くとこんな感じ

const char hello[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

const char *str = hello;

printf("%s", str);

str は char型の配列の先頭アドレスを保持してるだけ
0611デフォルトの名無しさん2010/05/01(土) 12:15:45
つまり最後のstrは配列名ってことですか?
だとしたら先頭の文字が格納されたアドレスが出てくるのではないかと思うのですが…
%sというのはそれを文字に変換する機能があるって事なんでしょうか。
0612デフォルトの名無しさん2010/05/01(土) 12:17:42
*strで取り出していくのはprintfの中の仕事だから
0613デフォルトの名無しさん2010/05/01(土) 12:18:39
printfの中の人が%sが来たらこの値は文字列の先頭アドレスだなって勝手に解釈して処理を分岐してくれるんだよ
0614デフォルトの名無しさん2010/05/01(土) 12:19:58
C言語での文字列ってのはただの配列

関数内部で配列の中身読んでるだけ
0615デフォルトの名無しさん2010/05/01(土) 12:21:13
なるほど、ありがとうございます
文字列の時だけはそういうものだと覚えてしまう事にします
0616デフォルトの名無しさん2010/05/01(土) 14:25:58
配列とかポインタとかじゃなくて
>%sというのはそれを文字に変換する機能があるって事なんでしょうか。
これが聞きたかっただけじゃないの?
0617デフォルトの名無しさん2010/05/01(土) 14:38:05
はっきり言ってイミフだものそれ
0618デフォルトの名無しさん2010/05/01(土) 15:32:03
一時的なバッファ領域をローカルに確保するとき(バッファのサイズはコンパイル時にわかっている)
バッファのサイズが大きい場合は静的配列じゃなくて動的配列でとった方がいいのかな?
0619デフォルトの名無しさん2010/05/01(土) 15:37:35
場合によるけど静的変数だと複数のスレッドでアクセスしたときに
困るかも
0620デフォルトの名無しさん2010/05/01(土) 15:53:46
staticの意味じゃなくてスタックにって意味じゃないかな
スタックあふれないならスタックでいいと思う
0621デフォルトの名無しさん2010/05/01(土) 16:27:41
一時変数かmalloc/newかとも取れる
0622デフォルトの名無しさん2010/05/01(土) 19:20:35
>611
610ではないのだが、

>つまり最後のstrは配列名ってことですか?
違う。strはポインタ。配列名はhello。
ただしstr=hello;
とすることでstrはhelloを指している。

printf("%p, %p\n", str, hello);

とすれば両方とも同じポインタ値(普通はアドレス)だと言うことがわかる。

>%sというのはそれを文字に変換する機能があるって事なんでしょうか。
変換って言うのはまた微妙な表現だね。%sは対応する変数がC文字列を
指している物として、その文字列を表示する。
0623デフォルトの名無しさん2010/05/01(土) 21:40:01
void myPrint(const char *str) // char のポインタを受け取るだけ
{
printf("%s", str);
}

int main()
{
myPrint("ABCDE"); // その1:const 文字"列の先頭"の、アドレスを渡している

char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している
myPrint(foo);

char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している
myPrint(bar);

myPrint(&(*bar)); // その4:意味は無いがその3のポインタが指す先のアドレスを渡している
// ※その4での動きは、 bar はポインタ変数、*bar はポインタ変数が指している何か、
// &(*bar) は、ポインタ変数が指している何かのアドレス=ポインタ変数に格納されているアドレス
return 0;
}
0624デフォルトの名無しさん2010/05/01(土) 21:44:56
const文字列を引数に受け取る場合
とりあえずconst string &にしとけって言われたんだけど
ぶっちゃけconst char *の方が実行効率はいいよね?
0625デフォルトの名無しさん2010/05/01(土) 21:48:07
静的解析通すためのNULLチェックめんどいです><
0626デフォルトの名無しさん2010/05/01(土) 22:41:51
C言語ですが、
配列の要素数の宣言に変数は使用できませんよね?

gcc(MinGW?)では可能と聞いたのですが、本当ですか?
またそれによって実行ファイルが環境に依存することはありますか?
0627デフォルトの名無しさん2010/05/01(土) 22:46:18
>>626
なんで配列の要素数の"宣言"に"変"数が使えないと思う?
06286262010/05/01(土) 22:55:43
>>627
すみません、わかりません。

perlを少しやっていて
配列の要素数の宣言に変数を使うことが当たり前だと思ったので。
0629デフォルトの名無しさん2010/05/01(土) 22:58:06
#include <stdio.h>

double avg(int *pt);

int main(void){
int test[5];
double ans;

printf("5人のテストの点数を入力してください。\n");

for(int i=0; i<5; i++){
scanf("%d", &test[i]);
}
ans = avg(test);
printf("平均点は%lf点です。\n", ans);
return 0;
}


double avg(int *pt){
double sum = 0.0;;

for(int i=0; i<5; i++){
sum += pt[i];
}
return sum/5;
}
平均を出すプログラムなのですがどこが間違ってますか?
平均点が0.0点担ってしまいます
0630デフォルトの名無しさん2010/05/01(土) 23:05:14
>>628
静的に確保されるメモリ領域の宣言は、「どのくらいの量を確保するのか」 決まっていないと確保のしようがない。
変数の値は動的に変わるので、そのような動的な線形リストを使いたい場合には、別途 std::vector などに頼るか、
あるいはストレートに malloc などでメモリ領域を確保しないといけない。

Perlなどのより高級言語の世界では、この辺の「メモリ空間の割り当て」などが人間向けに隠されているので
多分使っていても意識はしてなかったと思うけど、C/C++ の世界ではメモリの管理は自分でする。 あるいは、他人がした物を利用する必要がある。
お前さんは今、Perlとかの世界よりも、もっとCPUやメモリに近い所に立っているんだよ。

>>629
× int test[5];
○ double test[5];

0631デフォルトの名無しさん2010/05/01(土) 23:07:52
doubleじゃなくてよくね
0632デフォルトの名無しさん2010/05/01(土) 23:08:37
>>629
vc2008eeで試したが、ちゃんと平均出たぞ?
06336262010/05/01(土) 23:12:10
>>630
中々C言語は難しいですね。
勉強します。
0634デフォルトの名無しさん2010/05/01(土) 23:13:15
C99なら配列の要素数の宣言に変数が使える
それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど
0635デフォルトの名無しさん2010/05/01(土) 23:57:58
>>631
>>632
なぜなんでしょうね…mingwというコンパイラを使ってるんですが、0.000000点と表示されてしまうんです
0636デフォルトの名無しさん2010/05/02(日) 00:12:01
すみません、自己解決しました
%llfにしていたのが原因でした
0637デフォルトの名無しさん2010/05/02(日) 00:12:24
↑ミス
すみません、自己解決しました
%lfにしていたのが原因でした
0638デフォルトの名無しさん2010/05/02(日) 00:15:53
てか書籍のサンプルコードも普通にprintf("%lf", ans);になってるんですが、どっちを信じたらいいんでしょうか?
0639デフォルトの名無しさん2010/05/02(日) 00:19:59
>>633
C++なら可変長配列にはvectorを使う。この辺はC++の方が簡単だからC++を勧めるよ。

#include<vector>

void func()
{
int n=10;
std::vector<int> a(n); //intの配列
a[3]=100;
int g=a[7];
}
0640デフォルトの名無しさん2010/05/02(日) 00:48:45
>>638
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
0641デフォルトの名無しさん2010/05/02(日) 01:38:29
http://www.kouno.jp/home/c_faq/c12.html#9
0642デフォルトの名無しさん2010/05/02(日) 07:45:33
コードをLinux(GCC)、Windows(VC++)どちらでも使えるように
ifdefで自動的に切り替えられるようにしたいのですが
GCC、VC++特有のdefineで定義されている定数はありませんか?
0643デフォルトの名無しさん2010/05/02(日) 07:52:25
#include <stdio.h>
#include <string.h>

int main(void){

char str0[20];
char str1[20];
char str2[20];

strcpy(str1, "Hello");
strcpy(str2, "Goodday");
strcat(str0, str1);
strcat(str0, str2);

printf("str1の文字は%sです。\n", str1);
printf("str2の文字は%sです。\n", str2);
printf("str0の文字は%sです。\n", str0);
printf("str0の文字数は%dです。\n", strlen(str0));

return 0;
}

なぜかstr0の前に文字化けみたいなのがついて文字数もおかしくなります。
どうすればいいでしょうか?
0644デフォルトの名無しさん2010/05/02(日) 07:52:40
http://msdn.microsoft.com/ja-jp/library/ms253913%28VS.90%29.aspx
http://www.sra.co.jp/wingnut/gcc/cpp-j.html#Predefined
0645デフォルトの名無しさん2010/05/02(日) 07:56:22
>>643
strcpy(str1, "Hello");
strcpy(str2, "Goodday");
str0[0]='\0'; // ← これ
strcat(str0, str1);
strcat(str0, str2);

str0 の領域をゼロレングス文字列にしてから、strcat
0646デフォルトの名無しさん2010/05/02(日) 08:03:17
>>645
ありがとうございます。動きました。
0647デフォルトの名無しさん2010/05/02(日) 08:03:26
>>643
strcatは0を探して、そこから文字列を連結するってのは分かってるよな?
これを実行してみればいい。

#include <stdio.h>
#include <string.h>
int main(void){
  int i;
  char str0[20];
  for (i = 0; i < 20; i++) {
    printf("str0[%d] の中身は %d です。\n", i, str0[i]);
  }
  return 0;
}
06486422010/05/02(日) 08:04:44
>>644
ありがとうございます。
0649デフォルトの名無しさん2010/05/02(日) 08:08:33
ちなみに、>>645 がどういう意味かと言うと、

1.単に char str0[20]; としただけじゃメモリ領域が確保されただけなので、
  そこには既に何かの値が残っているかもしれない
2.printf や strlen など、「ここからここまでを文字列とみなす」 処理は、ASCIIコード 0x00 を終端として見ている
3.1と2から、中身をクリアしていない str0 を渡したらどうなるかは誰にもわからない

なので、先に 0x00 を置いて「空っぽの文字列」を表した。 と、言う事
str0[0]='\0'; とする代わりに strcpy(str0, ""); でもいいよ
0650デフォルトの名無しさん2010/05/02(日) 08:09:13
>>647
\0がなかったのが原因なんですね。

ところでこの滅茶苦茶な値はどっからきたんでしょうか?
0651デフォルトの名無しさん2010/05/02(日) 08:17:13
>>650
>>649 を見ろ。どこから来たんじゃなくて、既にあった何かだよ
メモリは有限なので常に再利用されてるだけ
0652デフォルトの名無しさん2010/05/02(日) 08:19:00
>>651
すみません、すぐ前の書き込みだったので見ずに投稿してしまいました。
ありがとうございました。
0653デフォルトの名無しさん2010/05/02(日) 10:21:44
何を再利用してそうなったのかってのを考えたり調べたりしてみても楽しいかもね
「再利用を繰り返すことで、本来見えない部分を見ようとする」攻撃手法もあるので
それを見越してゼロクリアするようになってる環境もあったりする
0654デフォルトの名無しさん2010/05/02(日) 10:43:21
>623

だいぶ間が開いてるけど指摘がないので。

>char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している
これ初期化だからアドレスを渡しているわけではない。
char foo[]={'X',Y'',Z'','\0'};
のシンタックスシュガーになっているだけ。


>char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している
これも微妙な表現。日本語で書くと以下のような感じ。
「配列fooの先頭要素をさすポインタを代入」
char *bar = &foo[0];
のシンタックスシュガーになっている。
0655デフォルトの名無しさん2010/05/02(日) 10:52:11
普通の関数はname space/classのどっちに所属させた方がいいんですか?
0656デフォルトの名無しさん2010/05/02(日) 11:19:12
>>654
指摘が無いのは、話の流れ上じゃね。論点の違いというか。
・・・ただまぁ、横から見ただけの初心者がそのレスだけみたら誤解するかもしれないから
安価つけて補足や指摘しておくのはいいことだと思うけど
0657デフォルトの名無しさん2010/05/02(日) 11:20:27
>>655
"普通の"ってのが何なのか分からないけど
ただの計算関数とかならnamespace
オブジェクトに属するならclass
■ このスレッドは過去ログ倉庫に格納されています