【问题标题】:C: compiler says "incompatible types" in assignment, but they are the same; and something relatedC:编译器在赋值中说“不兼容的类型”,但它们是相同的;和相关的东西
【发布时间】:2012-10-28 19:59:37
【问题描述】:

我刚刚偶然发现了 C 的一个非常奇怪的错误/功能(在 Windows 上 GCC 设置为 C11)。

struct my_struct {
    char my_string[65];
};

void foo (struct my_struct * array1, struct my_struct * array2) {
    array2[0].my_string = array1[0].my_string;
}

int main () {
    struct my_struct array1[60];
    struct my_struct array2[60];
    strcpy(array1[0].my_string, "Hello World!");
    foo(array1, array2);
    printf("%s\n", array2[0].my_string);
    return 0;
}

如果我尝试编译它,

error: incompatible types when assigning to type 'char[65]' from type 'char *'

foo 函数内部。

为什么?它们是完全相同的结构和数据类型。

另外,如果我将函数修改为

array2[0] = array1[0];

它有效。但是我正在制作另一个程序,它将字符串打印为(null)。我不知道为什么,但我会尝试更多。如果我可以制作一个重现错误的 sn-p,我将发布另一个问题。

【问题讨论】:

  • 测试试图达到什么目的?目前的代码 正在 分配并且不会成功。是否应该测试字符串 A = 字符串 B?如果是,那么“==”也不是您想要的,您需要查看 strcmp 或更好的 strncmp。或者如果你需要复制字符串 strcpy / strncpy.
  • 我的错。我的意思是测试为什么会发生这种情况。我将更改函数的名称。

标签: c windows gcc struct variable-assignment


【解决方案1】:

错误消息令人困惑,但您遇到的基本问题是数组不是 C 中的第一类类型——您可以声明数组,但实际上不能直接对它们做任何事情。

任何在表达式中使用数组的尝试都将被转换(静默)成一个匿名指针,指向数组的第一个(或者如果你愿意的话,可以是第零个)元素。这个指针不能赋值,只能解引用。

因此,当您说array2[0].my_string = array1[0].my_string; 时,您是在尝试分配给无法分配的东西,即使它们看起来具有相同的类型。与3 = 5; 之类的错误消息大致相同,但在这种情况下,您可能会收到更清晰的错误消息。

【讨论】:

  • 啊,现在我明白了。由于右边的表达式会给出一个值,它被取消引用,右侧将被分配,所以它没有被取消引用。感谢您的回答。
【解决方案2】:

在作业中

array2[0].my_string = array1[0].my_string;

char[65]array1[0].my_string 被转换为char*,一个指向数组第一个元素的指针。这就是incompatible type 的出现方式。

一般来说,无论如何你都不能分配给数组,所以那是行不通的。要么分配整个struct,要么复制数组内容。

【讨论】:

  • 我想我可以分配它,因为(有时?)数组被认为是指针,所以我想我会得到一个指向另一个的指针,或者类似的东西。无论如何,谢谢你的回答。
  • 在许多情况下,数组被隐式转换为指针,但并非总是如此。您可以执行类似于分配给数组的操作的唯一情况是初始化,int arr[4] = { 3, 17, 5, 0 };
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多