Основываясь на комментарий кого-то в другом потоке:Большой 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;
}
Является ли мое предположение правильным?
Можем ли мы определить, является ли использование VLA опасным или нет (может переполняться) на основе объекта sizeof
?
'int (* a) [n];' не является VLA. Это указатель на VLA. – chux
Почему вы умножаете 'sizeof (* a)' на 4? Вы делаете массив из 100000000x4? – dasblinkenlight
Кроме того, как отметил chux, 'int (* a) [n]' является указателем на VLA, а не сам VLA. – dasblinkenlight