为什么在分配时出现“不兼容的类型”错误?

时间:2014-07-18 06:03:32

标签: c

我有C代码似乎有类似的指针分配,但在编译时显示不同的行为。

我的结构声明和定义如下,

typedef struct {
    int a;
    char b[20];
}
TestStruct;
TestStruct t1;

为什么以下代码在“char *”类型中指定类型'char [20]'时出现“错误:不兼容的类型”

t1.b = "Hello World";

但下面的代码编译成功,

char *charPtr = t1.b;
charPtr = "Hello World";

注意:我正在使用GCC编译器v4.6.3

4 个答案:

答案 0 :(得分:1)

除非作为初始化的一部分,否则不能将字符串分配给C中的数组 这样做的正确方法是通过strcpy()标准标题的函数<string.h>

    strcpy(t1.b, "Hello world");  

数组t1.b不是指向char的指针 实际上,它具有类型为的20个元素的类型数组 在表达式中,数组通常衰减为指向char 的指针。

但是,阵列在内存中有固定的地址。它不是左值,它的地址不能通过赋值来改变。

相反的作业有效:

  charPtr = "Hello World";  

字符串“Hello world”的地址已分配给charPtr 但是,你的句子没有预期的效果:

   char *charPtr = t1.b;
   charPtr = "Hello World";

效果是charPtr等于t1.b的地址 然后,该值在第二句中被丢弃,并被数组“Hello world”的地址替换。

更多细节:小心处理字符串。像“Hello world”这样的字符串文字是一个存储(通常)在只读存储器中的数组。如果您尝试修改它,则可以获得意外结果。

特别是,这发生在赋值charPtr =“Hello world” 字符串可以读取,但不能更改。

要更改或操作字符串,必须将复制(使用strcpy())指向数组或已分配的内存部分。

答案 1 :(得分:0)

您无法直接将字符串文字指定给char数组。使用strcpy()strlcpy()

在第二个示例中,数组衰减为指针,然后更改该指针。请注意,在此示例中,t1.b保持不变。

答案 2 :(得分:0)

定义时:

  

typedef struct {      int a;     char b [20];   } TestStruct;

b是指向char的常量指针。因此t1.b =&#34; Hello World&#34 ;;是一个编译错误,因为它改变了t1.b

的值

解决方案:

1)使用strcpy:

    strcpy(t1.b, "Hello World");

2)棘手的铸造方式

    char** pb = (char**)&t1.b;
    *pb = "Hello World";

尽管这两种方法具有相同的目的(将t1.b设置为&#34; Hello World&#34;字符串),但基本思想却截然不同。

答案 3 :(得分:-1)

您无法将const char*分配给char[],因为它违反了常量。