C言語なら私に聞け! Part 65

このエントリーをはてなブックマークに追加
947の勘違いは
配列とポインタの違いの理解不足>>951
より
char配列初期化の省略形に対する理解不足>>950
が原因と見た。

まあ、配列とポインタがわかってない可能性も大だが。
おまいら親切だな
954947:03/10/19 12:10
>>950‐951
すいませんでした
どうもありがとうございます
955947:03/10/19 12:21
>>952
いえ、950の話はわかっていたのですが
951のようなことは知りませんでした

>まあ、配列とポインタがわかってない可能性も大だが。
char d[10];//あるいはd[]="abcd";
char* x=d;
という具合に初期化できることと
char* x="abc";
と書けることが、混乱したのかもしれません

char* x="abc";と書くことによって同じように操作(r、w)出来ると思ってました

でも、ポインタがわかっているのなら
書き込めてもよさそうなものだと思っていました

>>945
「文字列定数」という言葉が指し示すとおり、文字列定数は"変数"ではなく"定数"である。
>>945が疑問に思っているのは、どうせ同じ "メモリ" に記憶されているのだから、
書き換えさせてくれたっていいじゃん、ということだろう。

これに対する回答はいろいろあるだろうが、一番理解しやすい理由としては、
Cの規格は、定数を "RAM" ではなく "ROM" に書き込む処理系も
考慮しているから、という回答だけで十分だろう。

例)ROM への書き込み->NG
strcpy(c1,c2);//←これはダメ.実行時エラー

例)ROM からの読み込み->OK
printf("%s",c1);
//↑これもエラーになってもいいような気がするんですが・・・
>>956
簡単なことを偉そうな口調で説明するなよ、ヴォケ
958947:03/10/19 12:48
>>956
丁寧な回答ありがとうございます
その他の人も

読み込みOKで書き込みNGっていうことがあるのは今回はじめて知りました

まさに
>どうせ同じ "メモリ" に記憶されているのだから、
書き換えさせてくれたっていいじゃん、ということだろう。

こういうことを当然のように思っていました。
何のためのポインツなのかと疑問に思っていました
>>956
ANSI/ISO C に「文字列定数」などという言葉は出てこないわけだが。
>>959
英語だからでしょ?
リテラルと定数は違うってことだろ
963デフォルトの名無しさん:03/10/19 13:27
配列の配列をmallocするにはどうすればいいですか?

char* c=(char*)malloc(sizeof(char)*10);
char** cc=(char*)malloc(sizeof(c)*15);
こういう感じでいいですかね?
>>963
モレいつもこうやってる。
 int i, result = FAILURE;
 char **cc = (char **)malloc(sizeof(char *) * 10);
 if (!cc) goto finally__;
 for (i=0; i<10; ++i) {
  cc[i] = (char *)malloc(15);
  if (!cc[i]) goto finally__;
 }
 /*
  * cc[0][0] 〜 cc[9][14] まで使用可能
  */
 result = SUCCESS;
finally__:
 if (cc) for (i=0; i<10; ++i) free(cc[i]);
 free(cc);
 return result;
}
>962
俺はむしろ
「C言語+文字列定数」の検索結果が
「C言語+文字列リテラル」の検索結果と比べて
わずか100件しか多くないことに驚いたよ。
「定数」と「リテラル」の一般的な使用頻度をかんがえるとね。
なんかさ、くどいね
>1を読め、で終わりそうな話題が多いでつね
>>964
欠陥ありだな。
969964:03/10/19 14:03
>>968
まじ? 途中でメモリ割り当てに失敗しても,きちんと解h

あ!

ゼロクリアしてないとまずいね…
会社のソース,明日早速修正しなきゃ…
>>969
次からは calloc() を使用汁
> 会社のソース
(((ガクガクブルブル)))
>>970
欠陥ありだな。
どうか、我々が>>694の会社の製品を使っていませんように…
974973:03/10/19 14:12
>>973
×694
○964
>>973
どうか、我々がおっちょこちょいな>>973たんの会社の製品を使っていませんように…
976964:03/10/19 14:21
>>973
大丈夫 (;´Д`) 2年も "プロのプログラマ" やってて,
まともなプログラミングの仕事はこれがはじめてだから
>>976
964を騙るな

それにしてもイタ杉
>>964
次からは malloc の呼び出しは1回だけで済ませるようなコードに修正しておけ。
メモリの分断も防げるし、エラー処理も簡単になるし、実行速度も上がる。
979デフォルトの名無しさん:03/10/19 14:51
Cで3次元配列のメモリを確保するにはどうしたらいいですか?
そうですかそうですか。
>>964
このプログラムって
#define NULL 0

が前提で作っているんだよね?

#define NULL ((void *) 0)

な処理系で動くのかな?
>>979
まず、あなたの2次元配列を確保するソースコードを見せてください。
>>981 CFAQ嫁
>>981
>このプログラムって
>#define NULL 0
>が前提で作っているんだよね?

何を勘違いされているのでしょうか?
>>984
もうこのネタ面倒くさいだけだから刺激しないでくらはい
986979:03/10/19 15:00
>982
matrix=(double**)malloc(sizeof(double*)*x);
for(i=0;i<=x;i++){
matrix[i]=(double*)malloc(sizeof(double)*y);
}
987筆跡鑑定人:03/10/19 15:04
>>977
以下の観察事項より、>>969>>976 は同一人物だと推測されます。
1.文字と記号の間にスペース文字を入れている
2.読点に「,」を使用している
3.句点を使用していない
4.およそ60文字以内で改行を行っている
>>987
うほっ?そうなの?
>>986
matrix = (double**)malloc( sizeof(double) * x * y * z + sizeof(double*) * x * y + sizeof(double**) * x );
あとは中身を微調整
990979:03/10/19 15:12
>989
あり!
>>979
あなたの思想でいくとこんな感じになるのかなぁ。
エラーチェックは追加してね

double ***array3, **array2, *array1;
int counter1, counter2;

array3=(double***)malloc(sizeof(double**)*w);
for (i=0;i<w;++i)
array2=(double**)malloc(sizeof(double*)*x);
for (i=0;i<x;++i)
array1=(double*)malloc(sizeof(double)*y);

/*return(array1);*/
>>987
5.三点リーダー × 1 を使う
6.数字は半角

これを追加な

ちなみにこれは漏れの筆跡とも一致するわけだが…
>>991だが、途中で送ってしまった。すまん
994989:03/10/19 15:16
キャスト間違った
(double***) な
995989:03/10/19 15:18
利点はメモリ確保と解放が1度で済むこと
欠点は一見わかりにくいこと,アクセス違反しても検出されにくいこと
次スレはどこ?
>>995
ワロタ
998979:03/10/19 15:20
>991,994
あり
last1
うんこ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。