#include <stdio.h>
#include <stdlib.h>
void main()
{
char str[] ="asdfasdf";
char *s;
strcpy(s,str);
printf("%s",s);
}
这段代码有什么问题?我搞乱了char *和char []?
答案 0 :(得分:5)
您永远不会将s
设置为值,因此您需要调用未定义的行为。
在你的情况下,s = strdup(str);
可能会更好吗?
strcpy
没有为您的副本分配空间 - 它假设您已经这样做了。 strdup
为您分配内存。正如Jonathan Leffler在评论中指出的那样 - 如果你不想使用动态内存分配,你只需要一个足够大的&#34; chunk&#34;将字符串复制到。
在您的情况下,char *
和char[]
类型可以互换使用,只是您的指针未设置为有效的任何内容(可以设置为任何内容),但是代码假定它是有效的。
答案 1 :(得分:0)
char *s;
仅在一个字符指针中,并且当前没有指向任何有意义的内容。
s
指向str
,然后两者都会指向内存中的相同数组。char s[16]
,您可以在其中复制数组。在这种情况下,s
和str
将是两个独立的数组,并将存在于堆栈中的不同内存地址中。malloc
或strdup
分配一些内存以将字符串复制到其中。分配记忆就像拿出贷款一样。我们需要在计划结束时将其归还。确保使用它完成free
指针。在这种情况下,两个数组位于不同的内存地址中,第一个位于堆栈中,第二个位于堆中。