-1

我刚刚偶然发现了 C 的一个非常奇怪的错误/功能(GCC 在 Windows 上设置为 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). 我不知道为什么,但我会尝试更多。如果我可以制作一个重现错误的片段,我将发布另一个问题。

4

2 回答 2

1

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

任何在表达式中使用数组的尝试都将(静默)转换为指向数组第一个(或第零个,如果您愿意)元素的匿名指针。这个指针不能被赋值,它只能被取消引用。

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

于 2012-10-28T20:12:00.260 回答
1

In the assignment

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

the char[65] array1[0].my_string is converted to a char*, a pointer to the first element of the array. That's how the incompatible type arises.

Generally, you can't assign to arrays anyway, so that won't work. Either assign the entire struct, or copy the array contents over.

于 2012-10-28T20:09:13.263 回答