【问题标题】:Problems while dynamically allocating memory for a read input function为读取输入函数动态分配内存时出现问题
【发布时间】:2020-03-31 19:31:55
【问题描述】:

我在使用应该从用户那里读取字符串的函数时遇到问题。我总是得到(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;
}

【问题讨论】:

    标签: c user-input dynamic-memory-allocation getchar


    【解决方案1】:

    如果您想动态分配字符串,您需要将指针传递给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);
    

    【讨论】:

    • 我不是必须在return 0; 之前放置一个free(cur); 以防止内存泄漏吗?
    • @sneeed 绝对不是,您将内存留给调用者 (*input = cur)。如果你在返回之前释放一切都变得无效。在函数返回之后,调用者的工作就是使用数据并在完成后释放它。
    【解决方案2】:

    您应该返回 input 指针,因为它是您的函数的本地指针,并且在程序离开函数时被释放,所以在 main 中,arr 仍然是 NULL

    int* getString(char *input);
    
    int main(void)
    {
            //...
            arr = getString(arr);
            //...
    }
    
    int* getString(char *input)
    {
            //...
            return input;
    }
    

    【讨论】:

    • 谢谢你的解释!
    猜你喜欢
    • 2022-01-17
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多