Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
将指针传递到char*时,realloc()失败。为什么?(因为它是按值,而不是按引用!)_C_String_Realloc_Pass By Value - Fatal编程技术网

将指针传递到char*时,realloc()失败。为什么?(因为它是按值,而不是按引用!)

将指针传递到char*时,realloc()失败。为什么?(因为它是按值,而不是按引用!),c,string,realloc,pass-by-value,C,String,Realloc,Pass By Value,编辑谢谢约阿希姆。使用了您指出的函数签名,并在中传递了字符串的地址。在函数内部,我使用*currBuffer执行realloc(),并使用(*currBuffer)[lenBuffer]..将值放入字符串中 在realloc()决定需要分配一个不同的内存空间之前,按值传递指针的值工作正常。我必须只在函数条目上检查了指针的地址,而没有注意到它后来发生了更改。 我的程序从stdin获取用户输入,然后将其解析为令牌。 当我读取输入的每个字符时,我调用addChrToLine(userInput,ch

编辑谢谢约阿希姆。使用了您指出的函数签名,并在中传递了字符串的地址。在函数内部,我使用*currBuffer执行realloc(),并使用(*currBuffer)[lenBuffer]..将值放入字符串中

在realloc()决定需要分配一个不同的内存空间之前,按值传递指针的值工作正常。我必须只在函数条目上检查了指针的地址,而没有注意到它后来发生了更改。

我的程序从stdin获取用户输入,然后将其解析为令牌。 当我读取输入的每个字符时,我调用addChrToLine(userInput,charCount-1,(char)inputChr)to
void addChrToLine(char*currBuffer,int-lenBuffer,char-inputChr)
。 稍后,当我解析输入时,我在构建解析的字符串时使用相同的
addChrToLine
函数。但是,当解析器调用该函数时,它会在第25个字符上给出一个错误

读取用户输入的我的代码:

    char * userInput = malloc(sizeof(char));
    int charCount = 0;

LOOP
    if (!(inputChr == LF)) { // ignore the LF character as it denotes end of input line
        charCount++;
        addChrToLine(userInput, charCount-1, (char) inputChr);
        continue;
    }
将字符添加到当前行的我的代码:

void addChrToLine (char *currBuffer, int lenBuffer, char inputChr) {

    currBuffer = realloc(currBuffer, sizeof(char) * (lenBuffer +2));
    if (currBuffer == NULL) {
        perror(NULL);
        exit(ENOMEM);
    }
    currBuffer[lenBuffer] = (char) inputChr;
    currBuffer[lenBuffer+1] = (char) '\0';
}
我解析输入的代码:

    char * parsedCmd = malloc(sizeof(char));
    int ndxOutput = 0;

Switch statement inside a loop to handle variety of cases
    char currChr = command[ndxInput];

    if (addChr) {
        ndxOutput++;
        addChrToLine2(parsedCmd,ndxOutput-1,currChr);
//      parsedCmd = realloc(parsedCmd, sizeof(char) * (ndxOutput+2));
//      parsedCmd[ndxOutput] = command[ndxInput];
//      parsedCmd[ndxOutput+1] = '\0';
        addChr = FALSE;
    }
对于input=alphabet,例如“abcde…yz”,正确读取用户输入字符串,并且在进入解析阶段时一切都如预期的那样

将“a”解析为“w”时,char*指针
parsedCmd
正确显示内容。当我将“x”传递给
addChrToLine
时,它会正确放置字符并调整null的位置但是返回到解析器的下一行时,
parsedCmd
显示一个空字符串

addChrToLine
期间和调用之后,指针的内存位置与之前相同(因此realloc()没有移动我的数据)。但是,当我查看内存时,字符串的前8个字符现在是0x00,字符串在“I”之后保持完整,一直到“w”(无“x”)。 当代码尝试向parsedCmd添加“y”时,realloc()语句会发出一个错误
double-free或corruption(fasttop):0x0000000000605160***

我有点困惑为什么会发生这种事

更让我困惑的是,如果我注释掉对
addChrToLine
的调用,并取消注释接下来的三行(它们做同样的事情),就不会有错误,解析器也会很好地完成

很明显,我的指针或内存分配有问题,但我看不出有什么问题


有人能帮我理解这里发生了什么吗?

错误是C按值传递参数,这意味着它们被复制。因此,当您在函数中分配给
currBuffer
时,您只分配(和修改)本地副本。当函数返回时,旧的
userInput
仍保持不变

要解决此问题,您必须通过引用传递指针,这是在C中使用指针完成的,也就是说,您必须传递指向指针的指针:

另一种解决方案是返回新指针:

char *addChrToLine (char *currBuffer, int lenBuffer, char inputChr)
{
    ...
    return currBuffer;
}

...

userInput = addChrToLine(userInput, charCount-1, (char) inputChr);

为什么有这么多演员??哦,为什么?是他们造成了问题吗?根本不需要石膏。例如,您正在将
char
类型的变量强制转换为
char
类型,以便将其存储在
char
数组中。我知道。我正在学习C语言,并用它们来帮助我更快地学习记忆法。我不想编辑我粘贴的内容。我甚至想对此发表评论,因为我知道这会吸引一些人,而这些人会破坏问题的真正目的。但我选择了不让自己听起来咄咄逼人,而只是告诉别人发生了什么。
char *addChrToLine (char *currBuffer, int lenBuffer, char inputChr)
{
    ...
    return currBuffer;
}

...

userInput = addChrToLine(userInput, charCount-1, (char) inputChr);