【发布时间】:2019-04-20 21:45:10
【问题描述】:
如您所知,VLA's haves pros and cons 在 C11 中是可选的。
我认为让 VLA 可选的主要原因是:“堆栈会爆炸”:
int arr[n]; /* where n = 1024 * 1024 * 1024 */
但是指向 VLA 的指针呢?
int m, n;
scanf("%d %d", &m, &n);
int (*ptr)[n] = malloc(sizeof(int [m][n]));
在这种情况下,没有炸毁堆栈的风险,而且 IMO 它们非常有用。
我的问题是:
委员会能否保留指向 VLA 的指针,使 VLA 指向非指针类型是可选的?
或者一件事暗示另一件事?
(请原谅我的英语不好)
【问题讨论】:
-
它不是 PC,但我认为让 VLA 成为可选的主要原因是让 MS 可以假装他们有一个符合标准的编译器
-
int (*ptr)[n]只是一个指向大小为n的数组的指针。这里的n可以被编译器完全忽略,因为它没有任何用途。int *ptr;完全一样。 -
@PaulOgilvie -
n会影响指针运算在ptr上的执行方式。绝对不容忽视。 -
ptr + x必须等于(char*)ptr + x * (sizeof(int[n]))- 数组中的常用指针运算。就像行大小是一个常量表达式一样。在这种情况下,它不是。 -
全部清除。非常感谢。