C 将一个字符串分配给另一个字符串
为什么这段代码没有运行?为什么str1没有分配给str2??我知道我可以选择使用strcpy,但我想知道这不起作用的原因C 将一个字符串分配给另一个字符串,c,C,为什么这段代码没有运行?为什么str1没有分配给str2??我知道我可以选择使用strcpy,但我想知道这不起作用的原因 #include<stdio.h> int main() { char str1[]="hello"; char str2[10]; str2=str1; printf("%s",str2); return 0; } #包括 int main() { char str1[]=“你好”; char-str2[10]; str2=str1; printf(“%s”,
#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}
#包括
int main()
{
char str1[]=“你好”;
char-str2[10];
str2=str1;
printf(“%s”,str2);
返回0;
}
但是如果我使用指针,它会像这里一样工作
#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}
#包括
int main()
(
char*s=“早上好”;
char*q;
q=s;
而(*q!='\0')
{
printf(“%c”,*q);
q++;
}
返回0;
}
这很有效。
现在字符串已经通过指针复制了,那么为什么会有这样的差异呢
strcpy(str2,str1)
您需要逐个字符将str1
的每个元素复制到str2
中
您正在做的是尝试将str1
assign中字符串的地址分配给数组varstr2
,这是不允许的。静态数组不能用于分配值
即使您有char*str2;
然后str2=str1
虽然您的代码可以工作,但在这种情况下字符串不会被复制,而是str1
中字符串的地址被复制到str2
中,因此现在取消引用str2
将指向该字符串
还请注意,当您将字符串复制到char*str2
中时,请在复制之前分配足够的内存。
一种可能性是:
str2 = malloc (sizeof (char) * (strlen (str1) + 1));
strcpy (str2, str1);
str2
是一个静态数组。不能像指针一样重新分配它
对于指针示例,q=s
重新分配q
以指向s
所指向的相同空间。但是,指针重新分配不会复制该值
对于静态数组,使用
strcpy()
复制值。对于指针,使用strdup()
str2
,str1
引用其第一个元素的地址
所以数组的赋值不是以这种方式完成的
使用str[]
逐个字符分配字符
或者使用内置的strcpy,也可以使用strdup()它分配存储副本所需的确切空间量。在C中,您只能分配具有类型的对象;在C中,字符串不是数据类型。相反,它是一种约定—约定是字符串由以null结尾的字符数组表示;由于数组不被视为类型,因此字符串也不是类型
在第二个代码片段中,您只需将
q
指向s
;这不是s
处字符串的副本,而只是指针“s”的副本。它们都引用内存中的相同数据。因此,例如,如果您在“s”处更改字符串,然后在“q”处打印字符串,您将看到“q”处的数据也发生了变化。更直接地说,如果你使用printf(“s:%p,q:%p”(void*)s,(void*)q);你会发现它们都持有相同的指针值。内存的strlen可能重复的部分太小了一个字节,哦,这个函数在Windows中找到了吗?我想它只适用于兼容POSIX的操作系统。我错了吗?