如果我这样做:
#include <stdio.h>
typedef char **arr2D;
char arr1D [5 * 10];
int main (void)
{
((arr2D)arr1D)[0][0] = '_';
printf("%c", arr1D[0]);
return(0);
}
我收到崩溃,这表明未定义的行为。 为什么我不能这样做?
答案 0 :(得分:4)
char arr1D [5 * 10];
- 初始化为零。
((arr2D)arr1D)[0]
- 将arr1D
指向的内存重新解释为char *的指针。这有一个未指定的地址(零字节模式不一定是NULL地址)。
((arr2D)arr1D)[0][0]
- 拒绝未指定的地址。未定义的行为。
您的命名也暗示了关于指针和数组的常见错误观念。数组不是指针。指针不是数组。
数组衰减指向第一个元素的指针。
char[2][2]
是一个2D char数组,它将衰减为char(*)[2]
(指向数组的指针)。
char**
不是2D char数组,它是指向指针的指针。