请用C中的字符数组/字符串解释这种行为

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月

Ric*_*chN 8

因为这种操作:

char name[] = "pqrst";
Run Code Online (Sandbox Code Playgroud)

将常量字符串复制到堆栈上的数组.您可以自由修改本地副本.

但是,这种操作:

char *name=  "abcde";
Run Code Online (Sandbox Code Playgroud)

只需将字符串的地址指定给指针即可.尝试修改该字符串是试图修改常量字符串,该字符串位于受保护区域中,因此不允许.


Gru*_*rig 5

char* name = "abcde";
Run Code Online (Sandbox Code Playgroud)

分配一个指向您没有写访问权限的常量内存空间的指针.

char name[] = "vinay"; 
Run Code Online (Sandbox Code Playgroud)

分配可写数组.


pmg*_*pmg 5

字符串文字不可修改(在未定义行为的惩罚下).当你声明指向它们的指针时,你真的应该成功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)