【问题标题】:C: Incompatible types?C:不兼容的类型?
【发布时间】:2011-07-07 01:48:57
【问题描述】:
#include <stdlib.h>
#include <stdio.h>

struct foo{
    int id;
    char *bar;
    char *baz[6];
};

int main(int argc, char **argv){
    struct foo f;   
    f.id=1;

    char *qux[6];

    f.bar=argv[0];
    f.baz=qux;  // Marked line

    return 1;
}

这只是一些测试代码,因此请忽略 qux 实际上并没有任何有用的东西。

我在标记行incompatible types when assigning to type ‘char *[6]’ from type ‘char **’ 上遇到错误,但两个变量在代码中都定义为char *[6]。有什么见解吗?

【问题讨论】:

  • char *baz[6]; 声明了一个包含 6 个指针的数组。如果你想声明一个指向数组的指针,写char (*baz)[6];

标签: c types struct char


【解决方案1】:

在 C 中,您可以直接对物理内存进行分配。您当时可以指向 8、16、32 或 64 位的内存。数组分配需要在与您可以指向的那些可能部分匹配的相等部分中完成。

如果需要在不同时间指向多个这样的数组,你可以这样做:

struct foo{
    char **baz;
};

这应该允许您更改指向的数组:

f.baz=qux;

【讨论】:

    【解决方案2】:

    你不能像在 C 中那样复制数组。你必须逐个元素地复制它们:

    int i;
    for (i = 0; i < 6; ++i)
        f.baz[i] = qux[i];
    

    【讨论】:

      【解决方案3】:

      这段代码的问题在于该行

      f.baz=qux;
      

      尝试将数组qux 分配给数组baz。在 C 中,数组不是变量,不能被赋予新值。看一个更简单的例子,这段代码:

      int arr1[10], arr2[10];
      arr1 = arr2; // Error!
      

      是非法的,因为第二行试图为第二个数组分配第一个数组的值,这在 C 中是不允许的。

      要解决这个问题,您可能需要编写一个显式循环来复制元素,如下所示:

      int i;
      for (i = 0; i < 6; ++i)
          f.baz[i] = qux[i];
      

      这是合法的,因为数组的每个单独元素都是一个char *,可以赋值。

      您有时还会看到 memcpy 用于分配数组:

      memcpy(f.baz, qux, sizeof f.baz);
      

      这会复制数组中所有字段的原始字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2021-11-23
        • 2011-04-14
        • 2013-05-15
        • 2011-12-05
        相关资源
        最近更新 更多