我写了这个C代码:
#include<stdio.h>
#include<string.h>
int main()
{
char *i, *p, *p1="Hello";
strcpy(p,p1); //The first strcpy works.
printf("%sn", p); //show copy successful
printf("Please hit a key to continue....n");
getchar();
strcpy(i,p); //The second strcpy causes stop working problem. Why?
printf("%sn", i);
return 0;
}
有人能告诉我为什么第二个strcpy
不起作用吗?
我想说你很幸运第一个strcpy一开始就工作了!您基本上是将POINTER声明为一个char,而不是其他内容。要使strcpy正常工作,您需要确保您有一个足够大的char数组来容纳您的副本。换句话说,首先为指针分配一些内存,或者使用一个数组。。。
您需要为字符分配内存。你可以这样做:
char* p1 = "Hello";
char* i = (char*)malloc(sizeof(char) * 6);
char* p = (char*)malloc(sizeof(char) * 6);
之后(返回前)请不要错过free
:
free(p);
free(i);
此外,使用malloc
和free
:还需要额外的include
#include<stdlib.h>
你的完整样品应该是这样的:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char* p1 = "Hello";
char* i = (char*)malloc(sizeof(char) * 6);
char* p = (char*)malloc(sizeof(char) * 6);
// 1st copy
strcpy(p,p1);
printf("1st copy: %sn", p);
// 2nd copy
strcpy(i,p);
printf("2nd copy: %sn", i);
getchar();
// free prior allocated memory
free(p);
free(i);
return 0;
}
问题是strcpy
不会为您的字符串分配内存,因此如果您不这样做,它很可能会崩溃。
幸运的是,这个程序只会给你一个分段错误。您可以使用malloc
或calloc
分配内存,也可以使用函数strdup
为您分配内存。
char *i, *p, *p1="Hello";
p = strdup(p1);
printf("%sn", p); //show copy successful
printf("Please hit a key to continue....n");
getchar();
i = strdup(p);
printf("%sn", i);
free(p);
free(i);
之后别忘了释放记忆!