c-为什么我的代码中的第二个strcpy()导致停止工作



我写了这个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);

此外,使用mallocfree:还需要额外的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不会为您的字符串分配内存,因此如果您不这样做,它很可能会崩溃。

幸运的是,这个程序只会给你一个分段错误。您可以使用malloccalloc分配内存,也可以使用函数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);

之后别忘了释放记忆!

相关内容

  • 没有找到相关文章

最新更新