[過去ログ] C言語なら俺に聞け 163 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
216: (ワッチョイ ff63-y7MN) 2024/09/17(火)12:47 ID:bX/ekV+z0(2/3) AAS
#include <stdio.h>

char hage[10] = {0};

char *hoge(void)
{
// ++hage; // error '++' には左辺値が必要です。
// return hage;
 return &hage[1];
}

int main(void) {
 char *p = hoge();
 printf("%p, %p\n", hage, p);
 return 0;
}
217
(1): (アウアウエー Sadf-N1Zj) 2024/09/17(火)13:07 ID:TMGdiCOOa(2/2) AAS
>>214
そんなことは判ってるよ
(char hage[10]) で hage++ または ++hage 出来ちゃってる(ように観える)のが問題なんでしょ
関数の引数は (char hage[]) または (char *hage) のみにすれば良かった
(char hage[10]) はどうみても蛇足(結局境界テストされてないし)
218: (ワッチョイ ff63-y7MN) 2024/09/17(火)13:11 ID:bX/ekV+z0(3/3) AAS
問題だと思う人は、使わないようにしましょう
開発サイトでそういうルールを用意するのも手です
219: (スプッッ Sd3f-2MD7) 2024/09/17(火)17:17 ID:9gub94Dsd(2/3) AAS
>>215
納得しました。
220: (ワッチョイ 9ffd-NiVF) 2024/09/17(火)20:17 ID:dLWvmxgr0(1) AAS
>>197
そもそもstr系mem系はアドレスを受け取るんであって配列を受け取る関数ではないっていう勘違いがあるんだけど
それはともかく大きさがどうのとかなんちゃらが都合がいいとか、本当にC言語でなんかプログラムを書いた事あるの?
221: (スプッッ Sd3f-2MD7) 2024/09/17(火)20:58 ID:9gub94Dsd(3/3) AAS
俺は尻より胸派なんだよね。
222
(8): (ワッチョイ d7cd-qbvN) 2024/09/18(水)00:42 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]に意味が出る
223: (ワッチョイ bfee-GITO) 2024/09/18(水)01:22 ID:9DvoA/Ly0(1/2) AAS
ド素人w
224
(1): (ワッチョイ d712-IGT5) 2024/09/18(水)05:59 ID:Y3+kk9yU0(1) AAS
>>222

c faq 6.21 (英文が詳しい)
外部リンク[html]:c-faq.com
>>207 の'調整'は'adjust'だろう
N1256を'adjust'で検索するのじゃ
Look, a new day has begun.
225: (ワッチョイ d710-SKTh) 2024/09/18(水)07:51 ID:9Z5pFVfx0(1) AAS
8/16bit時代の1バイトでも、1ステップでも減らせってのを経験した人と
最近の可読性、移植性、安全性優先設計が当たり前世代とのギャップ。
226: (ワッチョイ bf32-GITO) 2024/09/18(水)08:59 ID:9DvoA/Ly0(2/2) AAS
ギャップの問題じゃねーから
文脈すら理解できないじじいはすっこんでろ
227: (ワッチョイ 5701-vU+L) 2024/09/18(水)09:30 ID:Qk7JHPx80(1) AAS
専門板によくいるアスペだな
228: (ワッチョイ ff63-y7MN) 2024/09/18(水)10:34 ID:UYQxUcxO0(1/4) AAS
225 は釣りでしょう
229: 警備員[Lv.2][新芽] (ワッチョイ bfd9-/vo+) 2024/09/18(水)13:08 ID:eTGNACyx0(1/2) AAS
>>222
sizeof(hage) で配列のサイズが求まるの?
と思ったら、「char * (ポインタ)の大きさを返すよ」みたいな警告が @gcc
230: (ワッチョイ ff63-y7MN) 2024/09/18(水)13:15 ID:UYQxUcxO0(2/4) AAS
釣りだか天然だか、分からなくなってきた 笑
231: はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/18(水)13:35 ID:td/rS/wM0(1) AAS
今どきの統合開発環境を使ってるなら変数の型くらい見れると思うけれど
古典的な手法としてあえてエラーにしてメッセージを読むという型の確認方法がある。

void foo(char bar[10]) {}
int main(void) { int baz = foo; }

こんなコードをたとえば gcc でコンパイルを試みると

error: initialization of 'int' from 'void (*)(char *)' makes integer from pointer without a cast

というエラーになる。
foo の型が void (*)(char *) であることがわかる。
foo は関数型の式 (関数指示子) なので暗黙に関数ポインタに型変換されているのと
bar に相当する箇所の型が char* になってるのがわかる。
232: 警備員[Lv.3][新芽] (ワッチョイ bfa6-/vo+) 2024/09/18(水)13:51 ID:eTGNACyx0(2/2) AAS
なるほど
勉強になります
233
(1): (スプッッ Sd3f-2MD7) 2024/09/18(水)14:54 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]));
の結果ってどんな値表示されるの?
234: (スプッッ Sd3f-2MD7) 2024/09/18(水)14:56 ID:LEoKOQZWd(2/5) AAS
書式のとのuzじゃなくてzuだっけ?zだけでよかったっけ?
ま、主旨はそこじゃないからいっか。
235
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ d7e2-6w0d) 2024/09/18(水)15:47 ID:3rwci13t0(1) AAS
>>233
sizeof(char*)/sizeof(char) ということになる。
sizeof(char) は確実に 1 だから結果としては単に char* のバイト数ってことだね。

この場合は「『もし 10 に意味があるとしても』境界チェックはされないことに変わりないのでなんの役にも立ってない。 役に立てるとしたらここまで書かなきゃならない」というのが主旨なのであくまでもしもの話。
実際の値はどうでもよい文脈だと思う。
236: (ワッチョイ d7cd-qbvN) 2024/09/18(水)16:33 ID:wcwImUMc0(2/3) AAS
>>224
ああそうなの
昔のことだから記憶違いをしてたようだ
237: (スプッッ Sd3f-2MD7) 2024/09/18(水)16:43 ID:LEoKOQZWd(3/5) AAS
>>235
>>222 の「これなら[10]に意味が出る」ってのは間違いってことね。
238
(1): (ワッチョイ d7cd-qbvN) 2024/09/18(水)18:00 ID:wcwImUMc0(3/3) AAS
'ここの10は意味ありませんよ'
って警告を出してもいいじゃんってことでしょ
それなら例えば

typedef char HAGE_TBL[10];
void foo(HAGE_TBL hage) {}
(毎回10とか書くのは危険なのでこういう使い方が多いと思う)

などとした場合に毎回警告が出てうざいことになるんじゃないか
239: (ワッチョイ ff63-y7MN) 2024/09/18(水)18:07 ID:UYQxUcxO0(3/4) AAS
警告ならまだ笑っていられるが、
明らかに書いた奴の意図とは違って誤動作してるだろ
240: (スプッッ Sd3f-2MD7) 2024/09/18(水)18:30 ID:LEoKOQZWd(4/5) AAS
>>222 のバグを晒すスレはここですか?
241: (スプッッ Sd3f-2MD7) 2024/09/18(水)18:46 ID:LEoKOQZWd(5/5) AAS
C言語は難しいな
242: (ワッチョイ ff63-y7MN) 2024/09/18(水)20:53 ID:UYQxUcxO0(4/4) AAS
void aaa()の中で、
引数で渡された値が何かを確かめて見ると良い
それと、 sizeof(hage)やsizeof(hage[0])の値も

プログラム書いた人の意図としては、
sizeof(hage)/sizeof(hage[0])が10になるはずなんだが
さてさていくつだろうか?
243: (ワッチョイ 9f7c-2MD7) 2024/09/19(木)00:15 ID:5H+5PGV10(1) AAS
もうやめて!>>222 のライフはゼロよ!
244
(1): (ワッチョイ 9f1e-S785) 2024/09/19(木)06:32 ID:zdFAvN1E0(1) AAS
本人が新たなネタを出してくるんだもん。
>>238 でもわざわざ
typedef char HAGE_TBL[10];
ってやっておきながら、なんで
void foo(HAGE_TBL hage)
なの? 構造体と同じように
void foo(HAGE_TBL *hage)
ってしてみたら新たな何かが見えてこないかい?
245
(1): (ブーイモ MMbf-GITO) 2024/09/19(木)15:36 ID:bQAYIDF0M(1) AAS
cは洗練された型システム持ってないんだからそんなところ頑張っても無駄なんだよ
この悟りに至って始めて脱初級
原則語るならそれからにしてくれ
1-
あと 757 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.024s