结构中的char*可重写,但main()函数不可重写。为什么?
我想知道同一个字符*在struct和main()函数中驻留时的区别 代码如下:结构中的char*可重写,但main()函数不可重写。为什么?,c,string,pointers,literals,C,String,Pointers,Literals,我想知道同一个字符*在struct和main()函数中驻留时的区别 代码如下: struct student { char* name; }; int main() { // char* in struct struct student bob; bob.name = "alice"; bob.name = "bob"; printf("name: %s\n", bob.name); // char* in main() ch
struct student {
char* name;
};
int main() {
// char* in struct
struct student bob;
bob.name = "alice";
bob.name = "bob";
printf("name: %s\n", bob.name);
// char* in main()
char *name = "kim";
*name = "lee";
printf("name: %s\n", name);
return 0;
}
输出:
name: bob
name: kim
在使用struct的情况下,student bob.name的值从“alice”更改为“bob”。但是,在后一种情况下,char*name的值没有改变
我认为“kim”没有改成“lee”的原因是char*name指向了字面上的“kim”
如果我是对的,为什么鲍勃的名字从“爱丽丝”改为“鲍勃”?它不应该改成“bob”,因为“alice”也是字面意思
区别是什么?您的代码调用未定义的行为
既然你这样做了:
struct student { char* name;};
struct student bob;
bob.name = "alice";
i、 e.您正在使指针name
,指向字符串文本
那你就:
bob.name = "bob";
使指针指向另一个字符串文字,这是可以的,因为您只是修改指针指向的位置,而不是它指向的字符串文字(例如bob.name[3]=“f';
,这将导致分段错误,因为它将尝试修改字符串文字-禁止)
如果您计划将指针指向字符串文字,那么我建议您这样声明:
const char* name;
它允许您更改指针指向的位置,但不允许更改指针指向的字符串文本的内容
现在:
char *name = "kim";
是一个字符串文本,其内容无法修改。当你这样做的时候:
*name = "lee";
你只是做了一些不允许的事情,结果是程序格式不正确。你的示例无法编译 *name=“lee”//错误1错误C2440:“=”:无法从“常量字符[4]”转换为“字符”
原因是*name指向一个字符,“lee”是一个字符[4]。一个是
name=…
另一个是*name=…
?*name=“lee”
甚至不应该编译,或者至少应该得到一个警告。请尝试与*name=
相同。并始终尝试有0个警告@不幸的是,MichaelWalz没有编译。除非已启用警告并将警告视为错误。这是C
@bolov。根据C标准,编译器需要为此给出诊断消息。如果它以警告或错误的形式出现,则由编译器决定。如果程序员选择忽略警告,那么代码不工作就是程序员的问题。第一种情况:他不需要内存分配。他只是将指针指向字符串文字。没关系。唯一危险的事情是让char*
而不是const char*
指向字符串文字,但由于他不修改它的内容,所以幸运的是:没关系。就我所能回忆起的C