c - 将 char 数组类型转换为 char **

标签 c arrays pointers memory-management type-conversion

如果我这样做:

#include <stdio.h>

typedef char **arr2D;

char arr1D [5 * 10];

int main (void)
{
    ((arr2D)arr1D)[0][0] = '_';

    printf("%c", arr1D[0]);

    return(0);
}

我收到崩溃消息,这表明存在未定义的行为。 为什么我不能这样做?

最佳答案

  1. char arr1D [5 * 10]; - 初始化为零。

  2. ((arr2D)arr1D)[0] - 将 arr1D 指向的内存重新解释为指向 char* 的指针。它有一个未指定的地址(零字节模式不一定是 NULL 地址)。

  3. ((arr2D)arr1D)[0][0] - 取消引用未指定的地址。未定义的行为。

您的命名还暗示了对指针和数组的常见误解。数组不是指针。而且指针不是数组。

数组衰变为指向第一个元素的指针。

char[2][2] 是一个 2D char 数组,它将衰减为 char(*)[2](指向数组的指针)。
char** 不是一个 2D char 数组,它是一个指向指针的指针。

关于c - 将 char 数组类型转换为 char **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660171/

相关文章:

c - 在c中添加到字符串末尾的额外字符

C union 数组未被修改

python - python中的指针

c++ - 为什么将 COM 指针参数强制转换为 void 而不是 IUnknown?

mysql - 使用 perl 将数据库的每一行保存为目录中的单独文本文件?

c - 为什么 'address of' 运算符给我的指针地址与指针本身不同?

objective-c - 将 CFIndex 转换为 NSUInteger?

c - 内存分配头是否需要对齐 union ?

在 C 中复制多维数组

根据数据表在 C 中创建数组