簡體   English   中英

具有目標指針和返回值的strcpy

[英]strcpy with destination pointer and return value

我的普通C有點生銹,目前我試圖弄清楚為什么第一個有效而第二個無效。

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

它基本上不是在做同一件事嗎?

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

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

像這樣調用函數:

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

為了更加准確,僅在與上述示例中一樣,只要在輸入函數之后才分配內存,就必須使用指針。 只是想對任何有指針問題的人說這話,並認為任何傳遞指針的過程總是要求指向要傳遞的指針的指針。

例如,下面的示例很好用。

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

當然,您幾乎永遠不會提前知道字符串的大小,或更常見的是緩沖區的大小。 我只是認為了解指針的微妙之處很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM