struct 中的 char* 是可重写的,但 main() 函数中的不是。为什么?
char* in struct is re-writable, but in main() function is not. why?
我想知道同一个 char* 驻留在 in struct 和 in 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]。
我想知道同一个 char* 驻留在 in struct 和 in 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]。