我一直认为指针运算是理所当然的。但有些时候我很不明白,编译器到底是怎么做的,什么时候会被评估?考虑一下下面的程序。
#include <stdio.h>
#include <stdlib.h>
int prng(void);
int main()
{
int x = prng(); // Pseudo Random Generator.
int (*a)[x];
a = malloc(sizeof(int) * 2 * x); // Allocate 2 rows of x columned vectors
printf("%p %p\n", a, a + 1); // How and When does a + 1 evaluate ?
return 0;
}
我几乎可以肯定,编译器(或者说运行时的程序)不会要求CPU添加... a
和 1
像一般的整数一样来评价 a+1
. 那么编译器(或程序)是如何设法获得正确的地址的呢?
那么,编译器(或程序)是如何设法获得正确的地址的呢?
a + 1
是在运行时评估的。
在运行时, *a
是 x * sizeof(int)
.
总和是由加到 a
, x
int
的到它。
注。
int (*a)[x];
是UB当 x <= 0
.
a + 1
当分配失败时为UB。