【问题标题】:malloc char array pointer in c gives errorc中的malloc char数组指针给出错误
【发布时间】:2014-03-31 07:34:48
【问题描述】:
char (*cHighValue)[20];

cHighValue = malloc (X * sizeof(char *));

for (i = 0; i < X; ++i)
{
    cHighValue [i] = (char *) malloc (20 * sizeof(char));
}

给我错误:表达式必须是可修改的左值,对于“cHighValue [i] = (char *) malloc (20 * sizeof(char));”为什么?

【问题讨论】:

标签: c


【解决方案1】:

cHighValue 是指向char 数组的指针。

分配为

cHighValue=malloc(sizeof(char)*20*X);

【讨论】:

  • sizeof(char)有什么意义?根据定义,它是 1。
  • 这有助于理解它确实是char 而不是char *
  • 那我就写malloc(sizeof(*cHighValue)*20*X)
  • @glglgl sizeof(char) 没有任何问题。它是可读的,因此阻止了他编写错误。然而,你写了一个致命的错误,因为你写了sizeof(*cHighValue)。 cHighValue 是一个数组指针,因此您分配了太多内存。而是保持简单。
  • @Lundin 你说得对,我没看两次。但是再说一遍:写sizeof(char) 在我看来毫无意义,因为它总是1
【解决方案2】:

您将 cHighValue 声明为指向 20 个字符的数组的指针。但是,在您的代码中,您将其用作指向指针数组的指针。您可能想要将 cHighValue 声明为指针数组,并且因为您在堆上分配它,所以必须将其声明为指向指针的指针。即:

char **cHighValue;

【讨论】:

  • 嘿!这不公平。 :)
  • @RikayanBandyopadhyay 坦率地说,直到现在我才看到您之前已经发布了我的答案的第二部分。我已将您的答案投赞成票作为补偿...
  • -1 表示“您必须将其声明为指向指针的指针”。这不是真的。将 2D 数组分配为 2D 数组,而不是其他东西...
  • @Lundin 我不明白你在想什么。我已经回答了为什么代码不起作用的问题。询问者清楚地分配指针数组,然后填充所有指针。为了使这段代码能够工作,所讨论的变量的类型应该是指向指针的指针。
  • @Marian 最初的问题似乎是关于分配一个二维数组。在这种情况下,他应该将数组指针保持原样并修复 malloc。指针数组不是二维数组,只是碰巧有相同的索引语法。
【解决方案3】:

cHighValue 是一个指向 20 字符数组的指针,因此 cHighValue[i] 是第 i 个 20 字节长的字符数组。
并且chars数组不是可修改的左值,可以为其赋值malloc()返回的指针值。

要实现您(可能)想要的,请从 cHighValue 声明中删除括号。

【讨论】:

    【解决方案4】:

    分配二维数组的正确方法是:

    char (*cHighValue)[Y];
    
    cHighValue = malloc( sizeof(char[X][Y]) );
    

    特别要注意:

    • 不要使用多个 malloc,因为它们不会为您提供真正的 2D 数组,而是在整个堆中分配的分段指针到指针查找表。这种查找表不能与 memset、memcpy 等基本函数一起使用。
    • 在 C 中强制转换 malloc 的结果是没有意义的。

    【讨论】:

      【解决方案5】:

      是数组的类型,

      char* cHighValue[20];
      
      
      cHighValue[0] = malloc (X * sizeof(char *));
      
      for (i = 0; i < X; ++i)
      {
           cHighValue[i] = (char *) malloc (20 * sizeof(char));
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 2021-01-26
        • 2021-05-16
        • 1970-01-01
        • 2012-03-19
        相关资源
        最近更新 更多