struct 中的 char* 是可重写的,但 main() 函数中的不是。为什么?

char* in struct is re-writable, but in main() function is not. why?

我想知道同一个 char* 驻留在 in structin main() function.[=12= 之间的区别]

代码如下:

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.name 从 "alice" 变成了 "bob"?它不应该更改为 "bob" 因为 "alice" 也是字面意思。

有什么区别?

您的代码调用了未定义的行为

既然你这样做了:

struct student { char* name;};
struct student bob;
bob.name = "alice";

即您正在使指针 name 指向字符串文字。

那么你只需:

bob.name = "bob";

使指针指向另一个字符串文字,这没问题,因为您只是修改指针指向的位置,而不是它指向的字符串文字(例如 bob.name[3] = 'f';,这将导致分段错误,因为它会尝试修改字符串文字 - 禁止)。

如果你打算让你的指针指向字符串文字,那么我建议你这样声明:

const char* name;

这允许您更改指针指向的位置,但不能更改指针指向的字符串文字的内容。


现在这个:

char *name = "kim";

是一个字符串文字,其内容无法修改。当你这样做时:

*name = "lee";

你只是做了一些不允许的事情,导致程序格式错误。

您的示例无法编译。

*姓名="lee"; // 错误 1 ​​error C2440: '=' : 无法从 'const char [4]' 转换为 'char'

原因是*name指向一个char,而"lee"是一个char[4]。