C言語なら俺に聞け 163 (987レス)
前次1-
抽出解除 レス栞

235
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ d7e2-6w0d) [sage] 2024/09/18(水) 15:47:33.09 ID:3rwci13t0(1) AAS
>>233
233(1): デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 14:54:11.13 ID:LEoKOQZWd(1/5) AAS
>>222
>この場合に限らずcでは範囲チェックなどされないでしょ
>必要なら自分でチェックするのが原則

>void aaa(char hage[10],int idx)
>{
> if((UINT)idx < sizeof(hage)/sizeof(hage[0]))
> printf("%d=%d¥n",idx,hage[idx]);
> else
> printf("%dは範囲外だhage¥n",idx);
>}

>これなら[10]に意味が出る

printf("%uz\n", sizeof(hage)/sizeof(hage[0]));
の結果ってどんな値表示されるの?
sizeof(char*)/sizeof(char) ということになる。
sizeof(char) は確実に 1 だから結果としては単に char* のバイト数ってことだね。

この場合は「『もし 10 に意味があるとしても』境界チェックはされないことに変わりないのでなんの役にも立ってない。 役に立てるとしたらここまで書かなきゃならない」というのが主旨なのであくまでもしもの話。
実際の値はどうでもよい文脈だと思う。
237: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/18(水) 16:43:30.74 ID:LEoKOQZWd(3/5) AAS
>>235
>>222
222(8): デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/18(水) 00:42:28.78 ID:wcwImUMc0(1/3) AAS
>>217
この場合に限らずcでは範囲チェックなどされないでしょ
必要なら自分でチェックするのが原則

void aaa(char hage[10],int idx)
{
if((UINT)idx < sizeof(hage)/sizeof(hage[0]))
printf("%d=%d¥n",idx,hage[idx]);
else
printf("%dは範囲外だhage¥n",idx);
}

これなら[10]に意味が出る
の「これなら[10]に意味が出る」ってのは間違いってことね。
273
(2): デフォルトの名無しさん (ワッチョイ 63e3-VZV9) [] 2024/09/26(木) 23:55:11.03 ID:jCy2QsTx0(1) AAS
>>235
これの1行目は文字列長によらず固定値にならない?
char* と char[] を区別できてないように思う

// これは (ヌル文字を含む) 4バイトのデータがスタック上に作られる
// sizeof(a1) の結果は文字列数により変わる
char a1[] = "abc";

// こう書いた場合、文字列の実体は静的な領域 (テキスト領域) に確保され、
// a2にはそのアドレスが渡される。
// sizeof(a2) はポインタのサイズであり、値は文字列長によらず固定
char* a2 = "abc";
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.414s*