修改函数中的指针

Modifying a pointer in a function

我制作了一个允许通过键盘输入字符串的函数。该函数有两个参数:字符串的最大可能长度和指向 char 的指针。函数内部发生的事情是声明一个字符数组,其中元素的数量与最大长度一样多,然后用户给出的字符串被临时存储在该数组中。字符串的获取完成后,我使用 calloc 函数分配恰到好处的内存量,以将相同的字符串存储在指向已作为参数传递的 char 的指针中。

int main(void)
{
    char* test;

    stringInput(test, 10);

    printf("%s", test);

    return 0;
}

void stringInput(char* string, int maxStringLength)
{
    char tempString[maxStringLength];

        //STRING GETS PROPERLY STORED IN tempString

    string = (char*)calloc(strlen(tempString)+ 1, sizeof(char));

    strcpy(string, tempString);

    return;
}

这种工作,意味着如果我尝试在此函数命中 return 之前打印 "string",程序实际上会显示它应该显示的内容。但是,当我尝试在主函数中打印 "test" 时,它没有打印任何内容,这意味着 stringInput 没有修改传递给它的指针。我通过在函数调用之前、calloc 行之后以及函数调用之后再次打印 "test" 的地址进一步证实了这一点,这表明它在 calloc 之后发生了变化,但是当功能结束。 我该如何解决这个问题?

这里的问题是,test本身是按值传递的,它存储在string中,您对string所做的任何更改都不会反映回[=12] =].

如果你想修改test本身,你需要传递一个指向test的指针。

类似

 stringInput(&test, 10);

void stringInput(char** string, int maxStringLength)
{
    char tempString[maxStringLength];

        //STRING GETS PROPERLY STORED IN tempString

    *string = calloc(strlen(tempString)+ 1, sizeof(char));  // no need to cast
    if (!string) {
       printf("error in calloc!!\n");
       return;
     }
    strcpy(*string, tempString);

    return;
}

当您将 calloc 转换为 string 时,您只修改了 string 的本地副本,而不是 test 变量。您可能想要做的是传入并操作指向您的 char 指针的指针。

您可以将函数签名更改为:

void stringInput(char **string_p, int maxStringLength)

然后,将您对 string 的用法替换为 *string

最后,您将调用您的函数,传递一个指向 test 的指针,而不是它的值:

stringInput(&test, 10);

这是一种处理方式,但您也可以 return 一个指针,具体取决于您希望如何构建事物。