Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用realloc有什么问题_C_Realloc - Fatal编程技术网

使用realloc有什么问题

使用realloc有什么问题,c,realloc,C,Realloc,我正在尝试使用realloc从用户那里获得无限制的输入。这就是我到目前为止所做的: int getCharactersFromUser(char* arr,char terminator) { char c = getch(); int length =0; while(c!=terminator) { arr = realloc(arr, sizeof (arr)*(++length)); arr[length-1]=c; c = getch(); }

我正在尝试使用realloc从用户那里获得无限制的输入。这就是我到目前为止所做的:

int getCharactersFromUser(char* arr,char terminator)
{
char c = getch();
int length =0;
while(c!=terminator)
    {
    arr = realloc(arr, sizeof (arr)*(++length));
    arr[length-1]=c;
    c = getch();
    }
return length;
}
我用arr调用这个方法,如下所示:char*unknownArr=calloc0,sizeof*unknownArr; int length=getCharactersFromUser&unknownArr,用于列表的TEMINATOR;
此处,列表的TEMINATOR_是eof

如果要更改调用者的arr副本,则需要将指针传递给指针

另外,sizeof arr提供了char*的大小;您的代码似乎采用sizeofchar。这保证为1,允许简化内存大小的计算

int getCharactersFromUser(char** arr,char terminator)
{
    *arr = NULL; // first call to realloc will crash if `*arr` is uninitialised in caller
    char c = getch();
    int length =0;
    while(c!=terminator)
    {
        *arr = realloc(*arr, ++length);
        (*arr)[length-1]=c;
        c = getch();
    }
    return length;
}

看看sizeofarr的值是多少。另外:如果你想使用EOF,你的字符需要一个int。EOF不能保证适合一个字符。这似乎也是一种情况,在这种情况下,最好以2的幂进行realloc,每次加倍。当然,这意味着在重新分配之间可以读取多个字符*arr*arr=malloc1;还有,@JoshuaTaylor说了些什么。如果maxlen==curlen*arr=realloc*arr,maxlen*=2@Jonahnson如果传入未初始化的指针,您的版本将崩溃。OP必须选择防止哪种形式的误用,并适当记录其功能。你能解释一下为什么我需要指向指针的指针吗?指向起始地址的指针还不够吗?如果希望调用方能够访问str,则必须将其变量的地址传递到getCharactersFromUser中。他们的变量是char*,所以这个的地址是char**。