[英]Strcpy Segmentation Fault C
我正在学习一些新东西并陷入简单的strcpy操作。 我不明白为什么我第一次打印作品,但第二次不打印。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *name;
char *altname;
name=(char *)malloc(60*sizeof(char));
name="Hello World!";
altname=name;
printf("%s \n", altname);
altname=NULL;
strcpy(altname,name);
printf("%s \n", altname);
return 1;
}
问题从这里开始:
name=(char *)malloc(60*sizeof(char));
name="Hello World!";
您使用字符串文字替换了malloc
返回的值。
你泄露了内存(因为你无法重新获得malloc
返回的指针值)。 对malloc
所有调用都与相应的free
调用相匹配。 由于该指针值消失了,因此使用该指针值调用free
的机会也消失了。
您还要写入NULL指针,这是未定义的行为(在您的情况下,会产生分段错误)。
您需要为altname
分配内存:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *name;
char *altname;
name=(char *)malloc(60*sizeof(char));
name="Hello World!";
altname=name;
printf("%s \n", altname);
altname=NULL;
// allocate memory, so strcpy has space to write on ;)
altname=(char *)malloc(60*sizeof(char));
strcpy(altname,name);
printf("%s \n", altname);
return 1;
}
第一次,您将altname
指向与name
相同的位置。 这没关系,因为name
指向一个有效的char*
( "Hello World!"
文字的第一个元素)
// both point to beginning of "Hello World!" literal
altname=name;
第二次,您尝试将name
指向的数据复制到altname
指向的altname
,该位置在此阶段指向NULL。 所以你试图写入NULL,这是错误的来源。
strncpy
要求目标缓冲区是可写的,并且足够大以将源字符串的数据复制到其中。 您需要使altname
指向一个足够大的缓冲区,以便字符串name
的内容指向。
altname = (char*)malloc(60*strlen(name)+1); // +1 for nul terminator
strcpy(altname, name);
还要注意,当你设置name = "Hello World!"
,你泄漏它最初指向的内存。 你需要先释放它:
free(name);
name = "Hello World!";
您正在尝试为没有空间存储的altname
分配值。 首先将内存分配给altname
然后分配
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *name;
char *altname;
name=(char *)malloc(60*sizeof(char));
name="Hello World!";
altname=name;
printf("%s \n", altname);
altname=NULL;
altname=(char *)malloc(sizeof(name)); // allocate memory
strcpy(altname,name); // Now assign
printf("%s \n", altname);
return 1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.