:宣言は、xが には大きすぎであることのためにクラッシュしようとしている場合は、 を知っていることはありませんので、大VLAオーバーフロー
のVLAは、彼らが解決するよりも多くの問題を引き起こしますスタック。
sizeof(a)
は、スタックのために長すぎるので、このコードは、オーバーフローします:sizeof(a)
は8(私のコンピュータでポインタのサイズ)であるため、
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 100000000;
int a[4][n];
printf("%zu\n", sizeof(a));
return 0;
}
しかし、この1つはできません:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 100000000;
int (*a)[n];
printf("%zu\n", sizeof(a));
a = malloc(sizeof(*a) * 4);
free(a);
return 0;
}
私の前提は正しいですか?
sizeof
オブジェクトに基づいて、VLAの使用が危険であるかどうか(オーバーフローする可能性があります)を判断できますか?
'int(* a)[n];'はVLAではありません。これはVLAへのポインタです。 – chux
なぜ 'sizeof(* a)'に4を掛けますか?あなたは100000000x4の配列を作っていますか? – dasblinkenlight
さらに、chuxが指摘したように、 'int(* a)[n]'はVLAへのポインタであり、VLAへのポインタではありません。 – dasblinkenlight