这是一个遍历多维数组的例子。它像我检查的那样工作(使用 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("%p\n", *(tab + SIZE));
}
如果在我的系统上将 #define 12
更改为 #define 13
,输出将不再是 nil
。
这意味着它不能确定性地工作,而您确实走运。
关于C++ 遍历多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746733/