C 语言中字符数组的一个问题

int main()
{
  char s1[50], s2[50] = "hello";
  s1 = s2;
  printf("%s", s1);
}

s1 = s2 那句报错了,问题到底出在哪?求解。

阅读 6.8k
13 个回答

字符数组S1 S2的本身是地址,它是常量。把S1=S2就是把一个常量赋值给另一个常量当然是错误的。
字符串的赋值可以用String里相应的函数

程序在编译好之后,s1,s2的内部就分配好了,可以看成指向分配内存的首地址。如果s1=s2不报错,就相当于s1和s2都指向s2指向的内存,同时s1指向的内存就无法访问了。

GCC会提示下面错误:
error: incompatible types when assigning to type 'char[50]' from type 'char *'

就是类型不匹配喽,s1是数组名,不是变量,数组的元素,带[x]的才是变量。

用strcpy函数

c语言字符串不能直接用=

一句话:C和C++数组是不可拷贝的 是二等公民
可以使用std::array

s1不是左值不能被赋值

新手上路,请多包涵

s1和s2是常量,不是变量,就像你不能给2赋值一样(比如2=3),也不能s1=s2这样给s1赋值。
可以用for循环或者strcpy,strncpy去做。

新手上路,请多包涵

楼主,字符数组(不是new的)变量可以看成是一个指针常量,而不是常量指针(这两者有点拗口)。
可以改为 char *s1 = s2;

数组在 C 当中不是一等公民,换句话说,对一个数组赋值是不被允许的。

数组名实际上是指向数组头部的指针常量,也就是说,以下写法是可以通过编译并正确执行的。

char s2[] = "hello";
char* s1 = s2;
printf("%s\n", s1);
新手上路,请多包涵

不能对一个数组赋值,只能初始化。
数组之间不能等于。
可以写成:s2[50]="hello";
或者用指针:

`char *s2=s1;`
新手上路,请多包涵

C语言中数组的名称被当作常量地址。不能修改。
特别说明一下:
char s1[50], s2[50] = "hello";
这个语句,S1只声明,但是没有初始化,内存上可能都是无效值。s2有初始化为hello字符串。

最后那个括号没对齐,对齐就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进