直接用数组初始化:
#include <stdio.h>
int main(void) {
char str[] = "abc";
int i = 0;
while (str[i] != '\0') {
printf("%c\n", str[i]);
i++;
}
str[1] = 'd';
return 0;
}
没有问题,正常输出,没有报错。
但是如果用指针初始化:
#include <stdio.h>
int main(void) {
char *str = "abc";
int i = 0;
while (str[i] != '\0') {
printf("%c\n", str[i]);
i++;
}
str[1] = 'd';
return 0;
}
它执行到 str[1] = 'd' 的时候,就会报 segmentation fault,我在网上搜了一下,
都是说通过指针初始化的字符串是个常量,不能改变。感觉这个很坑啊,只是 char str[] = "abc" 和 char *str = "abc"; 这样小的区别而已,为什么通过指针初始化的那个就要是常量呢?是 C 语言规定就是这样,还是是可以理解的?
编译器就是这么做的,记住就行了,不必太纠结。 对linux来说,程序加载后内存是分段的。 screenshot
编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。
screenshot
验证:
include
int main(){
char a[]="abc";
char b[]="abc";
char *c="abc";
char *d="abc";
printf("%pn", a);
printf("%pn", b);
printf("%pn", c);
printf("%pn", d);
}
结果:
@ ➜ ~ ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a
编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。
screenshot
验证:
include
int main(){
char a[]="abc";
char b[]="abc";
char *c="abc";
char *d="abc";
printf("%pn", a);
printf("%pn", b);
printf("%pn", c);
printf("%pn", d);
}
结果:
@ ➜ ~ ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a
编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。
screenshot
验证:
include
int main(){
char a[]="abc";
char b[]="abc";
char *c="abc";
char *d="abc";
printf("%pn", a);
printf("%pn", b);
printf("%pn", c);
printf("%pn", d);
}
结果:
@ ➜ ~ ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a
编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。
screenshot
验证:
include
int main(){
char a[]="abc";
char b[]="abc";
char *c="abc";
char *d="abc";
printf("%pn", a);
printf("%pn", b);
printf("%pn", c);
printf("%pn", d);
}
结果:
@ ➜ ~ ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a
编译器就是这么做的,记住就行了,不必太纠结。
对linux来说,程序加载后内存是分段的。
验证:
#include<stdio.h>
int main(){
char a[]="abc";
char b[]="abc";
char *c="abc";
char *d="abc";
printf("%p\n", a);
printf("%p\n", b);
printf("%p\n", c);
printf("%p\n", d);
}
结果:
@ ➜ ~ ./a.out
0x7fff52ac3afc
0x7fff52ac3af8
0x10d13cf8a
0x10d13cf8a
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。