【问题标题】:Strcpy Segmentation Fault Cstrcpy 分段错误 C
【发布时间】:2014-10-21 06:50:47
【问题描述】:

我正在学习一些新东西,并陷入了一个简单的 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;
}

【问题讨论】:

  • 您没有为 altname/name 分配更多内存。
  • 哇,效率太低了。 sizeof(char)保证为1字节,如果要分配固定大小的内存,为什么要使用malloc()

标签: c strcpy


【解决方案1】:

您正在尝试将值分配给没有空间存储的altname。先分配内存给altname再分配

#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;
    altname=(char *)malloc(sizeof(name)); // allocate memory
    strcpy(altname,name);                 // Now assign 
    printf("%s  \n", altname);
    return 1;
}

【讨论】:

    【解决方案2】:

    问题从这里开始:

    name=(char *)malloc(60*sizeof(char));
    name="Hello World!";
    

    您将malloc 返回的值替换为字符串文字。

    1. 您泄漏了内存(因为您无法重新获得malloc 返回的指针值)。所有对malloc 的调用都与对free 的对应调用相匹配。由于该指针值消失了,使用该指针值调用free 的机会也消失了。

    2. 您进一步写入 NULL 指针,这是未定义的行为(在您的情况下,会产生分段错误)。

    【讨论】:

    • @juanchopanza - 我改变了我的答案。
    【解决方案3】:

    第一次,您使altname 指向与name 相同的位置。这没关系,因为name 指向一个有效的char*"Hello World!" 文字的第一个元素)

    // both point to beginning of "Hello World!" literal
    altname=name;
    

    第二次,您尝试将name 指向的数据 复制到altname 指向的位置,此时该位置指向NULL。因此,您尝试写入 NULL,这是错误的根源。

    strncpy 要求目标缓冲区是可写的,并且足够大以将源字符串的数据复制到其中。您需要使altname 指向一个足够大的缓冲区,以容纳name 指向的字符串内容。

    altname = (char*)malloc(60*strlen(name)+1); // +1 for nul terminator
    strcpy(altname, name);
    

    还请注意,当您设置name = "Hello World!" 时,您会泄漏它最初指向的内存。你需要先释放它:

    free(name);
    name = "Hello World!";
    

    【讨论】:

    • 不,实际上,他设置了 altname=NULL,并试图复制到那里,所以我会说空指针异常。
    • @Greycon 哎呀,我错过了 NULL。固定。
    【解决方案4】:

    你需要为altname分配内存:

    #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;
        // allocate memory, so strcpy has space to write on ;)
        altname=(char *)malloc(60*sizeof(char));
        strcpy(altname,name);
        printf("%s  \n", altname);
        return 1;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多