首页 文章

Strcpy分段故障C.

提问于
浏览 1784
2

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

  • 6

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

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

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

    问题从这里开始:

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

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

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

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

相关问题