【问题标题】:Why the second strcpy() in my code causes stop working?为什么我的代码中的第二个 strcpy() 导致停止工作?
【发布时间】:2015-10-28 22:48:11
【问题描述】:

我写了这段 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 不起作用?

【问题讨论】:

    标签: c char malloc strcpy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      之后(返回之前)请不要错过free

      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;
      }
      

      【讨论】:

      • 不应该 malloc(sizeof(char) * 4);malloc(sizeof(char) * 6);,因为“Hello”是 5 个字节加上字符串终止符?
      • 由于sizeof(char)总是1,建议简化为char* i = malloc(strlen(p1) + 1);
      【解决方案3】:

      问题是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);
      

      之后别忘了释放内存!

      【讨论】:

      • 感谢您的回复。只是一个关于 free() 的问题。如果程序关闭,内存在没有 free() 的情况下是否仍然被占用?我假设退出应用程序时内存全部释放。如果我使用 strdup() 将字符串存储到结构成员中,是否还需要在关闭应用程序之前释放它?谢谢!
      • @Steve 除非您使用的是 非常 旧的编译器,否则内存总是被释放。然而,依赖这个事实并不是好的做法。详情请见stackoverflow.com/questions/654754/…
      猜你喜欢
      • 2021-07-30
      • 2021-01-30
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 2011-04-06
      • 2020-03-22
      相关资源
      最近更新 更多