Difference between char[] and char * in C 
C中char[]s和char*s的区别是什么?我知道这两者都创建了一个指向字符数组的指针。然而,
| 12
 3
 4
 5
 
 | char s[] ="hello"; 
s[3] = 'a';
printf(" %s
 ",
  s); | 
打印helao,而
| 12
 3
 4
 5
 
 | char * s ="hello"; 
s[3] = 'a';
printf(" %s
 ",
  s); | 
给了我一个分割错误。为什么会有这样的区别?我在Ubuntu 12.04上使用gcc。
当使用char s[] ="hello";时,char数组是在当前函数的作用域内创建的,因此在进入函数时,在堆栈上分配内存。
当使用char *s ="hello";时,s是一个指向常量字符串的指针,编译器将该常量字符串保存在程序的内存块中,该内存块为写访问而被阻止,因此存在分段错误。
在这两种情况下,在可执行映像的只读部分分配一个常量字符串"hello\0"。
在char* s="hello"的情况下,每次调用函数时,变量s都被设置为指向该字符串在内存中的位置,因此它可以用于读取操作(c = s[i]而不是写入操作(s[i] = c)。
在char s[]="hello"的情况下,数组s在堆栈上分配,每次调用函数时都用该字符串的内容填充,因此它可以用于读操作(c = s[i]和写操作(s[i] = c)。
 
一个是指针,另一个是数组。
数组定义保留在当前作用域堆栈空间中的数据。
指针定义了当前作用域堆栈空间中的内存地址,但该地址引用了堆中的内存。