下面是一个在多维数组上迭代的例子。正如我所检查的那样(使用g++ 4.8.1编译)。我的问题是:为什么它会起作用?为什么元素数组的最后一个元素是指向NULL指针的指针?
struct Test {
int i;
};
Test** tab = new Test*[12];
for (int i=0; i<12; ++i) {
tab[i] = new Test();
tab[i]->i = i;
}
while (*tab != NULL) {
std::cout<<(*tab)->i<< std::endl;
++tab;
}
您正在看到编译器试图将堆栈对齐到特定的多个字节边界的副作用。当它这样做时,您将看到缓冲区后的零填充。
考虑下面的程序,我试图抓住问题的本质,而不使用多余的循环。
#include <stdio.h>
#define SIZE 12
struct Test {
int i;
};
int main(){
Test** tab = new Test*[SIZE];
for (int i=0; i<SIZE; ++i) {
tab[i] = new Test();
tab[i]->i = i;
}
printf("%pn", *(tab + SIZE));
}
如果您在我的系统上将#define 12
更改为#define 13
,则输出将不再是nil
。
这意味着它不确定地工作,并且您确实很幸运。