将字符串分配给另一个字符串

为什么这段代码没有运行? 为什么str1没有分配给str2? 我知道我可以选择使用strcpy,但我想知道为什么这不起作用?

#include int main() { char str1[]="hello"; char str2[10]; str2=str1; printf("%s",str2); return 0; } 

如果我使用指针比它在这里工作..

 #include int main() ( char *s="good morning"; char *q; q=s; while(*q!='\0') { printf("%c",*q); q++; } return 0; } 

这很有效。 现在字符串已经通过指针复制了,为什么会出现这种差异?

你需要这样做

strcpy (str2, str1)

你需要逐个str1地复制str1每个元素到str2

你正在做的是尝试将str1 assign中字符串的地址分配给不允许的数组var str2 。 静态数组不能用于指定值。

即使你有char *str2; 然后str2 = str1虽然你的代码可以工作,但是在这种情况下不会复制字符串,而是在str2复制str1字符串的地址,所以现在取消引用str2会指向字符串

另请注意,将字符串复制到char *str2始终在复制前分配足够的内存。 一种可能性是:

 str2 = malloc (sizeof (char) * (strlen (str1) + 1)); strcpy (str2, str1); 

str2是一个静态数组。 你不能像指针一样重新分配它。

至于你的指针示例, q=s重新指定q指向s指向的相同空间。 但是,指针重新分配不会复制该值。

对于静态数组,请使用strcpy()复制该值。 对于指针,请使用strdup()

str2str1引用它们的第一个元素的地址,因此不以这种方式完成数组的赋值使用str[]通过char分配char或使用内置的strcpy

您也可以使用strdup()来分配存储副本所需的确切空间量。

在C中,您只能分配具有类型的对象; 在C中,字符串不是数据类型。 相反,它是一种约定 – 惯例是字符串由以null结尾的字符数组表示; 并且因为数组不被视为类型,所以也不是字符串。

在你的第二个代码片段中,你只需要q指向s ; 这不是s字符串的副本 ,而只是指针”的副本。 它们都引用内存中的相同数据。 因此,如果您在’s’处更改了字符串,然后在’q’处打印了字符串,您将看到’q’处的数据也已更改。 如果你做了printf( "s:%p, q:%p" (void*)s, (void*)q ) ;更直接printf( "s:%p, q:%p" (void*)s, (void*)q ) ; 你会看到它们都拥有相同的指针值。