【问题标题】:Modifying a pointer in a function [duplicate]修改函数中的指针[重复]
【发布时间】:2019-09-25 03:24:16
【问题描述】:

我制作了一个允许通过键盘输入字符串的函数。此函数有两个参数:字符串的最大可能长度和指向 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;
}

这种工作,意味着如果我在这个函数返回之前尝试打印“字符串”,程序实际上会显示它应该显示的内容。但是,当我尝试在主函数中打印“test”时,它不会打印任何内容,这意味着 stringInput 不会修改传递给它的指针。我通过在函数调用之前、calloc 行之后和函数调用之后再次打印“test”的地址来进一步证实了这一点,这表明它在 calloc 之后发生了变化,但是在函数调用时又回到了之前的值结束。 我该如何解决这个问题?

【问题讨论】:

  • 你不需要void stringInput(char** string, int maxStringLength) 吗?这是一个指向指针的指针;这将允许您在方法中对其进行修改。

标签: c pointers dynamic-memory-allocation pass-by-value


【解决方案1】:

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

如果你想修改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;
}

【讨论】:

  • 他不想从例子来看
  • @P__J__ 他不想要什么?
  • @IanAbbott 为什么无效?我认为应该将注释更改为正确初始化tempString的代码是合理的。
  • @Gian 好吧,这就是 C 的工作方式。一切都是按值传递的。
  • @Gian 合理和/或漂亮的 C 代码要么接受指向缓冲区的指针和缓冲区的大小,并且只存储这么多字符,要么分配并 返回 一个指针到缓冲区。
【解决方案2】:

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

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

void stringInput(char **string_p, int maxStringLength)

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

最后,你会调用你的函数,传入一个指向 test 的指针,而不是它的值:

stringInput(&test, 10);

这是一种做事方式,尽管您也可以返回一个指针,具体取决于您希望如何构造事物。

【讨论】:

  • 是的,我曾尝试返回一个指针,它运行良好,但这并不是我真正想要的。不过,问题解决了,也谢谢你!
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多