这是迭代多维数组的示例。它检查工作(使用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;
}
答案 0 :(得分:2)
您正在看到编译器尝试将堆栈与特定的字节边界对齐的副作用。当它执行此操作时,您将在缓冲区后看到零填充。
考虑下面的程序,我试图在没有太多无关循环的情况下捕捉问题的本质。
#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("%p\n", *(tab + SIZE));
}
如果您在我的系统上将#define 12
更改为#define 13
,则输出将不再是nil
。
这意味着它确定无法正常工作,而你确实幸运。