2013-03-07 143 views
0
#include<stdio.h> 
#include<malloc.h> 
void my_strcpy(char *sour,char *dest){ 
if(sour == NULL || dest == NULL){ 
    return; 
} 
while(*sour != '\0'){ 
    *dest++ = *sour++; 
} 
*dest = '\0'; 
} 
int main(){ 
char *d = NULL; 
char *s = "Angus Declan R"; 
d = malloc(sizeof(char*)); 
my_strcpy(s,d); 
printf("\n %s \n",d); 
return 0; 
} 

此功能正常工作並打印字符串。我的疑問是指針「dest」將指向'\ 0',它如何打印整個字符串(因爲它沒有指向字符串的初始地址)。字符串複製功能

+2

第一次檢查應該是'(sour == NULL || dest == NULL)'(OR,而不是AND)。另外,malloc行應該是'd = malloc(strlen(s)+1);'('d'需要指向一個足夠大的緩衝區,以保存字符串's'中的每個字符加NULL字符) – user1354557 2013-03-07 19:39:08

+2

'd = malloc(sizeof(char *));'在大多數系統上沒有分配足夠的內存。通常一個指針是四個或八個字節大。 – 2013-03-07 19:40:18

+1

只是一個小建議,你可以通過讓它返回一個int來改善你的功能。也許複製的字符數量,以及指示指針是否爲NULL的內容(如-1)。 – teppic 2013-03-07 21:01:45

回答

1

確實dest會指向結束的字符串。但是您是而不是使用dest打印字符串 - 您正在使用d打印字符串,這是一個不同的變量。

請記住,在由默認值傳遞的C和C++價值 - 所以,當你調用my_strcpy變量d的值複製到變量dest其功能是本地函數只my_strcpy和任何變化變量不會影響d

另外請注意,你是d可變分配足夠的空間:

d = malloc(sizeof(char*)); 

這將爲一個指針人物這通常意味着有足夠的空間用於4分配足夠的空間(或可能8)個字符。您應該爲要打算複製的字符串分配足夠的空間一個字符用於終止空字節。您想要複製的字符串的大小是多少?提示:strlen應該有所幫助。

0

d傳入的指針是指針的副本,因此指針在函數中的位置/移動不會反射回main中調用的位置。雖然ddest都指向相同的內存塊(至少在初始時),並且對該內存塊的任何更改都會反映在兩端,但dest指針只是一個副本。

0
my_strcpy(s,d); 

C通過值傳遞參數。 d的值傳遞給my_strcpy,這意味着d裏面的對象main未在您的my_strcpy函數中修改。