簡體   English   中英

為讀取輸入函數動態分配內存時出現的問題

[英]Problems while dynamically allocating memory for a read input function

我在處理一個應該從用戶那里讀取字符串的函數時遇到了問題。 我總是得到(null)作為輸出。

對於這種問題,這甚至是“正確”的方法嗎?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getString(char *input);

int main(void)
{
        char *arr = NULL;
        printf("please enter string: ");
        getString(arr);
        printf("%s", arr);
        return 0;
}

int getString(char *input)
{
        int i;
        char c;
        char *tmp;
        input = malloc(sizeof(char));
        for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
                tmp = realloc(input, (i + 2) * sizeof(char));
                if (tmp == NULL) {
                        free(input);
                        printf("allocation error");
                        return -1;
                }
                input = tmp;
                input[i] = c;
        }
        input[i] = '\0';
        return 0;
}

如果你想動態分配字符串,你需要傳遞一個指向char*指針,而不僅僅是一個char * 這樣,函數就可以修改真正的char *指針,調用者會看到結果。 在您當前的代碼中, input變量僅存在於函數內部,不會影響調用者使用的變量,因此您的arr保持不變( NULL )。

像這樣的東西:

int getString(char **input)
{
        int i;
        char c;
        char *tmp, *cur = NULL;

        // No initial malloc() needed here.
        // Let realloc() do the job passing NULL the first time.

        for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
                tmp = realloc(cur, (i + 2) * sizeof(char));
                if (tmp == NULL) {
                        free(cur);
                        printf("allocation error");
                        return -1;
                }
                cur = tmp;
                cur[i] = c;
        }

        cur[i] = '\0';
        *input = cur;
        return 0;
}

然后像這樣傳遞參數:

getString(&arr);

您應該返回input指針,因為它是您的函數的本地指針,並且在程序離開函數時被釋放,因此在mainarr仍然是NULL

int* getString(char *input);

int main(void)
{
        //...
        arr = getString(arr);
        //...
}

int* getString(char *input)
{
        //...
        return input;
}

暫無
暫無

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

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