Qiita 7 - キータぞ、来たぞ、キータだぞー (768レス)
1-

311
(1): 2025/10/14(火)00:00 ID:EH8FowVD(1) AAS
Cで配列などのメモリ範囲外アクセスチェックは必ずするかと言ったらしないよね?
「必ず」というのはそれを必ずするライブラリを使うということで
フリーの配列ライブラリなんてないよね?
配列ライブラリを使うならRustでいいと
312: 2025/10/14(火)00:04 ID:a2UJ2nPa(1) AAS
>>311
そのためにC/C++は大量のセキュリティホールを生み出してきた
そんなことは許されない時代になった
C/C++はそれ以外にも多くの未定義動作など問題が多すぎるため使うべきではない
313: 2025/10/14(火)00:14 ID:lAetg0vq(1) AAS
「ソフトウェアはメモリ安全でなければならない」との声明を発表、米ホワイトハウス:「C」「C++」よりも「Rust」などの言語を推奨
外部リンク[html]:atmarkit.itmedia.co.jp

米国ホワイトハウスが開発者に対しC++やC言語からRustやJavaなどのメモリ安全性に優れたプログラミング言語への移行を勧める
外部リンク:gigazine.net
314: 2025/10/14(火)00:14 ID:sCKwxfM0(1) AAS
配列アクセスでの範囲チェックは絶対必要だけどオーバーフローチェックはやんなくていいって言ってる人の頭の中ってどうなってるのかな?
オーバーフローに関してだけはプログラムが完璧に作られてるからありえないって思想?
315: 2025/10/14(火)00:26 ID:JKaSUvhP(1) AAS
実際の利用で最も多いシーケンシャルアクセスはインデックスの範囲チェックを消すことができる

for (i=start; i<end; i++) { a[i]利用 }
これはループ内でiの終端チェックとa[i]の範囲チェックの2回起きる

for (p=&a[start]; p<&a[end]; p++) { *p利用 }
このように書くかもしくはコンパイラが取り扱うと
ループ内でpの終端チェックのみになる
しかし人間が行なうとミスが入り込む余地があるため好ましくない

Rustなどはこれを抽象的なイテレータとして提供していて抽象化とメモリ安全性と実行効率の三つを両立させている
316
(5): 2025/10/14(火)01:29 ID:QdU4k/SE(1) AAS
配列は静的メモリ確保なのに動的メモリ確保とごっちゃになっている素人w
317
(1): 2025/10/14(火)01:39 ID:gE5nGyvL(1) AAS
>>316
言語によって細かい区別や呼び方から実装方法まで様々に異なるため
こういう時に皆は抽象的に代表名として配列と呼んでいるだけだよ

その意味での配列を静的メモリ領域に置くこともあればスタック領域に動的に置くこともあればビープ領域に動的に置くこともある
そして静的であろうと動的であろうと場所がどこであろうと範囲チェックは必要
318: 2025/10/14(火)05:15 ID:vZAfdOxe(1) AAS
>>316
配列を必ず静的に確保する言語はレア
多くの言語は配列を宣言する位置によって動的確保がある

例えばC言語は関数内で配列を宣言すると関数呼び出しするたびに動的に配列を含めたローカル変数の領域がスタック上に自動的に確保される
静的確保ではなく動的確保であるからこそ関数の再帰呼び出しが可能になっている
319: 2025/10/14(火)07:20 ID:dimV1O2B(1) AAS
くっだらねえ
320
(2): 2025/10/14(火)15:07 ID:vn+4DI+D(1) AAS
>>316
静的メモリ確保の意味を理解できてないだろ
Cならグローバル変数とstatic変数が静的メモリ領域に確保される
配列もグローバル変数かstatic変数にした時のみ静的メモリ確保
そうでない普通の関数内の配列は動的メモリ確保
321
(2): 2025/10/14(火)20:36 ID:2xWEVdNj(1) AAS
>>320
CやRustだと「普通の関数内の配列」にはスタックに置かれるものもあるんですが
要素数はコンパイル時に決まってる必要はあるけど
322: 2025/10/14(火)21:04 ID:ZulSE3F6(1) AAS
>>321
違いは簡単
静的メモリ配置 ←アドレス固定
動的メモリ配置 ←アドレス変動

static宣言すると静的にメモリ領域が確保されてアドレスが固定になる
実例コード

void foo() {
static int a1[] = {1, 2, 3};
int a2[] = {1, 2, 3};
printf("アドレス固定 a1: %p\n", &a1);
省10
323: 2025/10/15(水)01:32 ID:F/Bk7x58(1) AAS
>>316
>>321
staticの意味は「静的な」
staticを付けないと動的に毎回確保されることくらい分かりそうなものだが
324
(1): 2025/10/15(水)02:42 ID:tBMKGpTr(1) AAS
なんてことだstatic宣言した変数が共有ライブラリの中だとアドレスが変わることがあるゾ!
325: 2025/10/15(水)02:49 ID:LnEbzNuN(1) AAS
>>324
リンク時に変わることはあっても
実行中にアドレスが変わることはない
326: 2025/10/15(水)18:27 ID:V1g0382z(1) AAS
cの静的動的はサイズが実行時に定まるか否かってことじゃないん?
staticかどうかはcプログラマにとっては別の感心事で
メモリの動静を語るときはそうだったと思うけど
俺の知ってる限り
staticつけてないローカルな配列のことを動的な確保って言ってる人見たこと無いわ
327: 2025/10/15(水)19:23 ID:MHowvYgL(1) AAS
Grokに訊いたら非標準のallocaやC99のVLAは動的確保に含まれる場合があるそうだ。
328
(1): 2025/10/15(水)19:43 ID:zk4Ust74(1) AAS
配列やベクタやリストやスライスなど、言語によって様々な呼び方や実装が異なるもの、全てに共通の必須な仕組みとして、
総称としての配列の範囲チェックの話をしていて、そのまま特定の言語に関係なくこの話の流れでいいんだよな

>>316
>>配列は静的メモリ確保なのに動的メモリ確保とごっちゃになっている素人w

静的と動的は様々な対象に用いられるが、今回は静的メモリ確保
これをアドレスが変わらないという解釈でも、いわゆるセグメントのうち静的領域に確保するという意味でも同じ
特定の言語の話ではないが、例えばC言語なら静的宣言(static宣言)をする変数がこれに該当する

動的メモリ領域は毎回アドレスが変わるという意味でも、何かをするたびにメモリ空間から領域を確保する意味でも同じ
ただし二つに分かれて、関数呼び出しのたびに領域が確保されて関数から去ると無効になるものと、関数呼び出しのタイミングと関係なく確保することで関数を去っても有効になるもの、それら二つの異なる性質のものに分かれる
いわゆるセグメント領域としては、前者はスタック領域に確保されて後者はヒープ領域に確保される
省1
329
(1): 2025/10/15(水)22:57 ID:dwkfuJij(1/5) AAS
>>317
コレクションという言葉を知らないのか?
配列は連続したメモリ領域だぞ?
330
(1): 2025/10/15(水)23:01 ID:dwkfuJij(2/5) AAS
>>320
あのさ、関数でも関数を呼び出す方でも実行時にメモリを確保するんだよ?

実行中にメモリを確保することは、また別の話。
1-
あと 438 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.012s