#define ROW 2
#define COL 3
void fun(int **p) {
int i = 0;
int j = 0;
for (;i < ROW;i++) {
for (j = 0;j < COL;j++) {
printf("%d\n", p[i][j]);
}
}
}
int main() {
int a[ROW][COL] = { { 1, 2, 3}, { 4, 5, 6 } };
int *p = &a[0][0];
fun(&p);
return 0;
}
上述代码没有编译错误,指针p指向数组a的首地址,但main函数把p的指针传递给fun函数,导致数组被扁平化了,fun函数能够正确打印出p[0][0]~p[0][2],但执行p[1][0]产生“Segmentation fault (core dumped)”越界访问中断,因为此时p + 1不是原本的a[1],而是指向一个未定义的区域。