0

为什么这段代码没有运行?为什么 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;
}

这行得通。现在字符串已经通过指针复制了,为什么会有这样的差异呢?

4

5 回答 5

1

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

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

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

于 2012-07-08T07:43:06.117 回答
0

你需要做

strcpy (str2, str1)

您需要逐个字符地复制str1 to的每个元素。str2

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

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

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

str2 = malloc (sizeof (char) * (strlen (str1) + 1));
strcpy (str2, str1);
于 2012-07-08T07:41:33.740 回答
0

str2str1引用它们的第一个元素的地址,因此数组的分配不是以这种方式完成的,要么使用str[]按字符分配字符,要么使用内置strcpy

于 2012-07-08T07:44:50.143 回答
0

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

于 2012-07-08T07:45:59.227 回答
0

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

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

于 2012-07-08T09:02:31.190 回答