2011-11-16 90 views
2

我是C編程的新手,我無法弄清楚爲什麼會發生這種情況。字符指針在c

char *example(char *temp) { 
     char *xyz; 
     memset(xyz,0,strlen(temp)); 
     strncpy(xyz,temp,3); 
     strcat(xyz,"XX); 
     return xyz; 
     } 

int main() { 
     char temp[] = "ABCDEF" 
     char *xyz; 
     xyz = example(temp); 
     printf("Returned string is: %s",xyz); 
     return 0; 
     } 

我只是想知道所有我做錯了,因爲我試圖運行GDB而事實證明,我試圖訪問的內存有些不可達的一部分,但我無法弄清楚。提前致謝。

回答

6

的問題是在這裏:

char *xyz; 
memset(xyz,0,strlen(temp)); 

你永遠不會初始化xyz。因此這是一個無效的指針。

你需要做的是爲它分配的東西是什麼:

char *xyz = malloc(strlen(temp) + 1); // Allocate, +1 is for the '\0'. 
memset(xyz,0,strlen(temp)); 

,並釋放它,當你用它做:

int main() { 
    char temp[] = "ABCDEF" 
    char *xyz; 
    xyz = example(temp); 
    printf("Returned string is: %s",xyz); 

    free(xyz); // Free 

    return 0; 
} 

編輯:其他問題:

這3行在這裏非常危險:

memset(xyz,0,strlen(temp)); 
    strncpy(xyz,temp,3); // The nul is not copied in strncpy. 
    xyz[3] = '\0';   // Add the nul manually. 
    strcat(xyz,"XX");  // You need to ensure that xyz is large enough. 
+0

他還用'strcat'等做了危險的事情,你可能想提一下。 –

+0

是的,你說得對。將更新答案。 – Mysticial

+0

'NULL'(有兩個l)通常指的是指針,而'nul'通常指的是ASCII字符。 –

0

xyz在您的代碼中未初始化,您只需將字符串'temp'複製到'example'中的隨機內存位置。您需要先分配它,即xyz = malloc(strlen(temp)+ 1);