: 선언이 x는 너무 큰 것에 대해 충돌을가는 경우에 당신이 결코 를 알 수 없기 때문에대형 VLA 다른 스레드에서 다른 사람의 의견을 바탕으로 오버 플로우
블라스, 그들은 해결보다 더 많은 문제를 소개합니다 스택.
sizeof(a)
스택 너무 길기 때문에이 코드는 오버플로 :
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 100000000;
int a[4][n];
printf("%zu\n", sizeof(a));
return 0;
}
하지만이 일 수 없습니다 sizeof(a)
8 (내 컴퓨터에있는 포인터의 크기) 때문에 :
#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