use*_*891 2 c string character-arrays
当我尝试某事时(我只是为了理解),我得到了这个.请解释一下这种行为:
第一次尝试:
void main()
{
char src[] = "vinay";
int i;
// char name[5] = "test";
char *name= "abcde";
printf("%s \n", name);
if (*(name+5) == '\0')
printf("6th char is null\n");
strcpy(name,src);
printf("printcheck \n");
for (i=0 ; i <6 ; i++)
{
printf("%c \n", *(name+i));
}
printf("%s \n",name);
}
Run Code Online (Sandbox Code Playgroud)
输出:
abcde
6th char is null
zsh: 16644 segmentation fault (core dumped) a.out
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
void main()
{
char src[] = "vinay";
int i;
char name[] = "pqrst";
//char *name= "abcde";
printf("%s \n", name);
if (*(name+5) == '\0')
printf("6th char is null\n");
strcpy(name,src);
printf("printcheck \n");
for (i=0 ; i <6 ; i++)
{
printf("%c \n", *(name+i));
}
printf("%s \n",name);
}
Run Code Online (Sandbox Code Playgroud)
输出:
pqrst
6th char is null
printcheck
v
i
n
a
y
vinay
Run Code Online (Sandbox Code Playgroud)
================================================== =========================================
问题:为什么尝试1会崩溃?我在Solaris机器内核版本上尝试了这个:SunOS 5.8 Generic 117350-43 2006年10月
因为这种操作:
char name[] = "pqrst";
Run Code Online (Sandbox Code Playgroud)
将常量字符串复制到堆栈上的数组.您可以自由修改本地副本.
但是,这种操作:
char *name= "abcde";
Run Code Online (Sandbox Code Playgroud)
只需将字符串的地址指定给指针即可.尝试修改该字符串是试图修改常量字符串,该字符串位于受保护区域中,因此不允许.
char* name = "abcde";
Run Code Online (Sandbox Code Playgroud)
分配一个指向您没有写访问权限的常量内存空间的指针.
char name[] = "vinay";
Run Code Online (Sandbox Code Playgroud)
分配可写数组.
字符串文字不可修改(在未定义行为的惩罚下).当你声明指向它们的指针时,你真的应该成功const
const char *name = "string literal";
Run Code Online (Sandbox Code Playgroud)
从标准引用:
6.4.5 String literals
6 .... If the program attempts to modify such an array,
the behavior is undefined.
Run Code Online (Sandbox Code Playgroud)