2014-08-27 116 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; 
}