1

動作しているように見えるこの単純なコードがあります (デバッガーで確認しました) が、関数の実行が終了すると、文字列は元の変数に保存されません。

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';
}

この小さな台本が終わると、

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

このコードをメイン関数に記述しても機能するので、関数でポインターを使用している方法に関係があると推測しています。

4

1 に答える 1

7

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';
}

コードにもう1つ小さな変更を加えました。計算を簡略化できるsizeof(char)ように、1であることが保証されています。realloc

于 2013-01-03T16:47:14.253 に答える