c++のnew演算子について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fly3555
記事: 6
登録日時: 7年前

c++のnew演算子について

#1

投稿記事 by fly3555 » 7年前

コード:

int main(){
	int *p;

	p = new int[1];

	p[0] = 0;
	p[1] = 1;
	p[2] = 2;

	delete[] p;

	return 0;
}
これを実行すると何のエラーもなく通ります。p[1],p[2]に関してはメモリの確保を行っていないのに代入できて大丈夫なのでしょうか。


アバター
asd
記事: 319
登録日時: 14年前

Re: c++のnew演算子について

#3

投稿記事 by asd » 7年前

fly3555 さんが書きました:
これを実行すると何のエラーもなく通ります。p[1],p[2]に関してはメモリの確保を行っていないのに代入できて大丈夫なのでしょうか。
pはint型の要素1つ分しか確保していないのでp[1]やp[2]にアクセスしてはいけません。
配列の添え字の範囲チェックはしてくれないのでエラーも出なければ、なんとなく動作するかもしれませんが、
p[1]やp[2]の領域はほかの用途で使われる可能性もあるので読み取りも書き込みもしてはいけません。
(ほかの変数領域を破壊したり、おかしな値が取得できたりと意図しない動作をします)
Math さんが書きました:int arrはint *(arr+i)のsyntactic sugarだからです

http://dixq.net/forum/viewtopic.php?f=3&t=8134


糖衣構文(syntactic sugar)であっても*(p+1)や*(p+2)にアクセスしてはいけません。
リンク先でも指摘されていることではありますが誤解しないようご注意ください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

返信

“C言語何でも質問掲示板” へ戻る