【问题标题】:Type casting char array to char **将 char 数组类型转换为 char **
【发布时间】:2017-05-30 08:01:20
【问题描述】:

如果我这样做:

#include <stdio.h>

typedef char **arr2D;

char arr1D [5 * 10];

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

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

    return(0);
}

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

【问题讨论】:

  • @Inline - 不。额外的星星很重要。
  • @Inline 在某种程度上,这现在甚至接近重复?

标签: c arrays pointers memory-management type-conversion


【解决方案1】:
  1. char arr1D [5 * 10]; - 初始化为零。

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

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

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

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

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

【讨论】:

  • 啊,是的..应该已经弄清楚了。所以我没有办法做到这一点。
  • @Malina - 我发现好的编程尽可能没有技巧。需要大量解释才能理解的代码应限制在尽可能小的范围内。
  • 我猜对我来说是个坏消息。当我发现自己是一个(不)好把戏时,我感觉很好。这只是一个相当平庸的把戏。 (而且我什至不会称其为“诡计”)可惜试图找到一个好诡计。
  • @Malina - 我不认为这些技巧很有趣。但是,当您必须在数月或数年后查看您自己的代码时。唯一被骗的就是你自己。
  • arr1D 没有未指定的地址。只要不取消引用内容,C 就允许进行各种疯狂的指针转换。如果char** 会被转换回正确的类型char(*)[2],那么它仍然会指向arr1D 的地址。
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 2013-06-06
  • 2016-03-10
  • 2023-03-11
  • 2022-01-22
  • 1970-01-01
  • 2015-05-14
  • 2017-07-28
相关资源
最近更新 更多