2014-08-27 117 views
2

我正在学习一些新东西,并陷入简单的strcpy操作。 我不明白为什么我第一次印刷作品,但第二次没有。strcpy分割错误C

#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; 
} 
+1

你不分配的备用名/姓名更多的内存。 – 2014-08-27 15:36:25

回答

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

最早的时候,你正在altname指向同一个地方作为name。这是OK的,因为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 = NULL,并试图复制到那里,所以空指针异常,我会说。 – Greycon 2014-08-27 15:38:56

+1

@Greycon哎呀,我错过了NULL。固定。 – juanchopanza 2014-08-27 15:39:31

6

的问题从这里开始:

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

你换成malloc用返回的值字符串字面量。

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

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

+1

@juanchopanza - 我改变了我的答案。 – PaulMcKenzie 2014-08-27 15:47:25

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