结构中的char*可重写,但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和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()
    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