Strcpy分段故障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;
}

回答(4)

2 years ago

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

2 years ago

问题从这里开始:

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

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

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

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

2 years ago

第一次,你正在 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!";

2 years ago

您正在尝试为 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;
}