2014-04-23 56 views
0

我的普通C有點生疏,我目前試圖找出爲什麼第一個工作,第二個沒有。strcpy與目標指針和返回值

char *returnSomething(void) { 
    char *s = (char *) malloc(5 + 1); 
    strcpy(s, "Hello"); 

    return s; 
} 

void dontReturnSomething(char *dest) { 
    char *s = (char *) malloc (5 + 1); 
    strcpy(s, "Hello"); 

    dest = malloc(strlen(s) + 1); 
    strcpy(dest, s); 
    free(s); 
} 

int main(int argc, char *argv[]) { 
    char *first = returnSomething(); 
    char *second = NULL; 
    dontReturnSomething(second); 

    printf("first: %s | second: %s", first, second); 
} 

它不是基本上做同樣的事情嗎?

+1

你有一個比你需要更多的strcpy。你可以直接使用malloc dest,直接複製到那裏。 – Linuxios

回答

3

要通過參數返回一個指針,你需要一個指向指針的指針。聲明destchar **dest

void dontReturnSomething(char **dest) { 
    char *str = "Hello"; 
    *dest = malloc(strlen(str) + 1); 
    strcpy(*dest, str); 
} 

這樣調用該函數:

dontReturnSomething(&second); // pass in address of second 
+0

太棒了!它的作品,我有點尷尬忘記,但很高興。 ;) 我假設像'strcpy'這樣的函數遍歷指針的內存並將其複製到一個新的對象中,對嗎? – Leandros

+1

@Leandros'strcpy'幾乎就是'while(* dest ++ = * srC++);'。請注意,當'0'被複制到'* dest'時,這將停止。 – ooga

+0

是的,我想到了這樣的事情。大。非常感謝! – Leandros

1

更準確,指針的指針是隻需要這麼長的,就像在上面的例子中,內存沒有被分配到後你輸入功能。只是想對任何有指針問題的人說,並且認爲指針的任何傳遞總是需要指向要傳遞的指針的指針。

例如,下面的例子工作得很好。

void dontReturnSomething(int* testint) 
{ 
    int test = 33; 
    *testint = test; 
} 

int main(int argc, char *argv[]) 
{ 
    int *first = calloc(1,sizeof(int)); 

    printf("Before: %d\n", *first); 
    dontReturnSomething(first); 
    printf("After: %d\n", *first); 
    return(1); 
} 

如果你運行它,你會得到0和33的預期。當然,要注意的是,你絕對必須分配給正在使用的指針的內存。如果爲函數內的指針分配了內存,那麼您將分配一個新地址,然後必須返回該地址以便地址可以保持。下面的例子也工作得很好。

void dontReturnSomething(char* testchar) 
{ 
    char* test = "Hello World!"; 
    strcpy(testchar,test); 
} 

int main(int argc, char *argv[]) 
{ 
    char *hello = NULL; 
    hello = calloc(13, sizeof(char)); 

    printf("Before: %s\n", hello); 
    dontReturnSomething(hello); 
    printf("After: %s\n", hello); 
    return(1); 
} 

當然,你幾乎不會知道字符串的大小,或者更多的時候是緩衝區。我只是認爲了解指針的微妙之處很重要。