如果我这样做:
#include <stdio.h>
typedef char **arr2D;
char arr1D [5 * 10];
int main (void)
{
((arr2D)arr1D)[0][0] = '_';
printf("%c", arr1D[0]);
return(0);
}
我收到崩溃消息,这表明存在未定义的行为。 为什么我不能这样做?
最佳答案
char arr1D [5 * 10];
- 初始化为零。((arr2D)arr1D)[0]
- 将arr1D
指向的内存重新解释为指向 char* 的指针。它有一个未指定的地址(零字节模式不一定是 NULL 地址)。((arr2D)arr1D)[0][0]
- 取消引用未指定的地址。未定义的行为。
您的命名还暗示了对指针和数组的常见误解。数组不是指针。而且指针不是数组。
数组衰变为指向第一个元素的指针。
char[2][2]
是一个 2D char 数组,它将衰减为 char(*)[2]
(指向数组的指针)。
char**
不是一个 2D char 数组,它是一个指向指针的指针。
关于c - 将 char 数组类型转换为 char **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660171/