我有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
答案 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[]
,因为它违反了常量。