我正在学习一些新东西并陷入简单的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;
}
4 回答
您需要为
altname
分配内存:问题从这里开始:
您使用字符串文字替换
malloc
返回的值 .你泄漏了内存(因为你无法重新获得
malloc
返回的指针值) . 对malloc
的所有调用都与对free
的相应调用相匹配 . 由于该指针值消失了,用该指针值调用free
的机会也消失了 .您还要写入NULL指针,这是未定义的行为(在您的情况下,会产生分段错误) .
第一次,你正在
altname
指向与name
相同的位置 . 这没关系,因为name
指向有效的char*
("Hello World!"
文字的第一个元素)第二次,您尝试将
name
指向的数据复制到altname
指向的位置,该位置在此阶段指向NULL . 所以你试图写入NULL,这是错误的来源 .strncpy
要求目标缓冲区是可写的,并且足够大以将源字符串的数据复制到 . 你需要使altname
指向一个足够大的缓冲区,以便字符串name
指向的内容 .另请注意,当您设置
name = "Hello World!"
时,会泄漏它最初指向的内存 . 你需要先释放它:您正在尝试为
altname
分配值,该值无法存储空间 . 首先将内存分配给altname
然后分配