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

Why the second strcpy() in my code causes stop working?

我写了这段 C 代码:

#include<stdio.h>
#include<string.h>

int main()
{
  char *i, *p, *p1="Hello";
  strcpy(p,p1);  //The first strcpy works.
  printf("%s\n", 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("%s\n", i);
  return 0;
}

谁能告诉我为什么第二个 strcpy 不起作用?

我会说你 幸运 第一个 strcpy 首先起作用了! 您基本上声明了一个指向 char 的 POINTER,仅此而已。 为了让 strcpy 正常工作,你需要确保你有一个足够大的 char 数组来容纳你的副本。换句话说,首先为你的指针分配一些内存,或者使用数组...

问题是 strcpy 不会为您的字符串分配内存,因此如果您不这样做,它很可能会崩溃。我会说这是偶然的第一个实例。

你很幸运,程序只给你一个分段错误。您可以使用 malloccalloc 分配内存,也可以使用函数 strdup 为您分配内存。

 char *i, *p, *p1="Hello";
 p = strdup(p1);
 printf("%s\n", p); //show copy successful
 printf("Please hit a key to continue....\n");
 getchar();
 i = strdup(p);
 printf("%s\n", i);
 free(p);
 free(i);

之后别忘了释放内存!

您需要为字符分配内存。你可以例如这样做:

char* p1 = "Hello";
char* i  = (char*)malloc(sizeof(char) * 6);   
char* p  = (char*)malloc(sizeof(char) * 6);     

请不要错过 free 之后(return 之前):

free(p);
free(i);

此外,需要额外包含才能使用 mallocfree:

#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: %s\n", p);

  // 2nd copy
  strcpy(i,p);
  printf("2nd copy: %s\n", i);

  getchar();

  // free prior allocated memory
  free(p);
  free(i);

  return 0;
}