为什么这段代码没有运行?为什么str1没有分配给str2?我知道我可以选择使用strcpy,但我想知道为什么这不起作用?
#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}
然而,如果我使用指针而不是像这里那样工作..
#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}
这很有效。 现在字符串已经通过指针复制了,为什么会出现这种差异?
答案 0 :(得分:1)
str2
是一个静态数组。你不能像指针那样重新分配它。
至于您的指针示例,q=s
重新指定q
以指向s
指向的相同空间。但是,指针重新分配会不复制值。
对于静态数组,请使用strcpy()
复制值。对于指针,请使用strdup()
。
答案 1 :(得分:0)
你需要做
strcpy (str2, str1)
您需要逐个字符地复制str1
到str2
字符的每个元素。
您正在尝试将str1
中字符串的地址分配给不允许的数组var str2
。静态数组不能用于指定值。
即使您有char *str2;
然后str2 = str1
,但您的代码仍然有效,但在这种情况下不会复制字符串,而是会复制str1
中字符串的地址在str2
中,现在解除引用str2
将指向字符串
另请注意,将字符串复制到char *str2
时,请始终在复制前分配足够的内存。
一种可能性是:
str2 = malloc (sizeof (char) * (strlen (str1) + 1));
strcpy (str2, str1);
答案 2 :(得分:0)
str2
和str1
指的是他们的第一个元素的地址
所以不以这种方式完成数组的分配
使用str[]
来按char分配char
或使用内置strcpy
答案 3 :(得分:0)
您也可以使用strdup()来分配存储副本所需的确切空间量。
答案 4 :(得分:0)
在C中,您只能分配 type 的对象;在C中,字符串不是数据类型。相反,它是一种约定 - 惯例是字符串由以空字符结尾的字符数组表示;并且因为数组不被视为类型,所以也不是字符串。
在您的第二个代码片段中,您只需将q
指向s
;这不是s
字符串的副本,而只是指针''的副本。它们都引用内存中的相同数据。因此,如果您在's'处更改了字符串,然后在'q'处打印了字符串,您将看到'q'处的数据也已更改。更直接的是,如果你printf( "s:%p, q:%p" (void*)s, (void*)q ) ;
,你会看到它们都保持相同的指针值。