【问题标题】:C and pointer in a function - changes do not save函数中的 C 和指针 - 更改不保存
【发布时间】:2012-12-18 01:45:05
【问题描述】:

我有这个似乎可以工作的简单代码(我用调试器检查过)但是当函数执行结束时,字符串没有保存在原始变量中。

void getString(char *iText);

int main()
{
    char *inputText=malloc(sizeof(char));
    getString(inputText);
    puts(inputText);
    free(inputText);
    system("pause");

    return 0;
}


void getString(char *iText)
{
    char c;
    int i=0;

    while((c=getchar()) != '\n')
    {
        iText = realloc(iText,sizeof(char)*(i+1));
        iText[i]=c;
        i++;
    }

    iText = realloc(iText, sizeof(char)*(i+1));  
    iText[i]='\0';
}

当这个小脚本结束时,我看到了一些

ε■ε■ε■ε■ε■ε■ε■ε■ε■ε■ε■ε■▲יע`*

如果我在我的 main 函数中编写这段代码,它就可以工作,所以我猜这与我在函数中使用指针的方式有关。

【问题讨论】:

  • 只要让getString返回指针,就简单多了。
  • 感谢您的建议,我没有考虑过这个选项!

标签: c arrays string pointers char


【解决方案1】:

getString 按值获取指针,因此无法更改调用者的指针。如果要重新分配字符串,请将指针传递给指针

int main()
{
    ....
    getString(&inputText);
    ....
}

void getString(char **iText)
{
    char c;
    int i=0;
    while((c=getchar()) != '\n')
    {
        *iText = realloc(*iText, i+1);
        (*iText)[i]=c;
        i++;
    }

    *iText = realloc(*iText, i+1);  
    (*iText)[i]='\0';
}

我对您的代码进行了另一项小改动 - sizeof(char) 保证为 1,因此可以简化 realloc 的计算

【讨论】:

  • 谢谢!我之前已经厌倦了它,但它并没有那么好用。现在我尝试使用您所写的(*iText),它成功了!
  • @simonc,但是如果 *inputText 是一个 char 指针,那么 inputText 就是地址(根据我对指针的任何基本知识),所以这个调用不应该实际修改那个位置的值吗? (答案是 OP 本身)但现在我希望在这里澄清一些概念。
  • @varevarao 传递 char* 允许您修改 char 数组的内容。如果要更改指向的数组,则需要一个指向 char 数组的指针 - char**
  • @simonc,天哪!我误解了问题的全部意义。有那么一刻,我认为我迄今为止使用指针编写的所有程序都是一个大谎言! :D 谢谢。
  • 还可以使用对指针的引用:void getString(char *&iText)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多