繁体   English   中英

Strcpy分段故障C.

[英]Strcpy Segmentation Fault C

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

问题从这里开始:

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

您使用字符串文字替换了malloc返回的值。

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

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

您需要为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;
}

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

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

第二次,您尝试将name指向的数据复制到altname指向的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分配值。 首先将内存分配给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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM