Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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*by指针会导致崩溃_C_Arrays_Function_Char_Dynamic Memory Allocation - Fatal编程技术网

在函数中修改char*by指针会导致崩溃

在函数中修改char*by指针会导致崩溃,c,arrays,function,char,dynamic-memory-allocation,C,Arrays,Function,Char,Dynamic Memory Allocation,我是C语言的新手,我正在尝试为读取文件计算动态内存分配。至少我认为这就是我在做的 无论如何,这段代码是有效的: int readfromfile(FILE *filepointer) { size_t size = 2; char *str = (char *) malloc(sizeof(char)); int character = 0; size_t counter = 0; while((character = fgetc(filepointer)

我是C语言的新手,我正在尝试为读取文件计算动态内存分配。至少我认为这就是我在做的

无论如何,这段代码是有效的:

int readfromfile(FILE *filepointer)
{
    size_t size = 2;
    char *str = (char *) malloc(sizeof(char));
    int character = 0;
    size_t counter = 0;
    while((character = fgetc(filepointer)) != EOF)
    {
        str = (char *) realloc(str, size);
        str[counter] = (char) character;
        size ++;
        counter++;

    }
    str[counter] = '\0';
    printf("+%s+", str);
    free(str);
    return 0;
}
而该代码不:

int main()
{
    char *str = (char *) malloc(sizeof(char));
    ...
    readfromfile(ifpointer, &str);
}

int readfromfile(FILE *filepointer, char **str)
{
    size_t size = 2;
    int character = 0;
    size_t counter = 0;
    while((character = fgetc(filepointer)) != EOF)
    {
        *str = (char *) realloc(*str, size);
        *str[counter] = (char) character;
        size ++;
        counter++;
    }
    str[counter] = '\0';
    printf("+%s+", *str);
    free(str);
    return 0;
}
我无法理解为什么,因为据我所知,我正在向函数发送一个指向char数组位置的指针,并每次访问数据。编译器不显示任何错误消息,它只循环一次,在第二次循环中,
realloc
每次都会崩溃。分配给第一个值的字符也是垃圾


我花了很长时间试图让它发挥作用,并且做了很多研究,所以如果我错过了一个解决方案,我很抱歉,但我真的被困在这一点上。

你会因为

*str[counter] = (char) character;

*(str[counter]) = (char) character;
相对于

(*str)[counter] = (char) character;
这正是你想要的。阅读您会发现
[]
*
(取消引用操作符)具有更高的优先级

此外,这里的强制转换以及对
realloc
malloc
的调用都是不必要的。不要忘记检查
realloc
malloc
等的返回值,看看它们是否成功分配了内存


现在,您有另一个问题:
free(str)应该是
free(*str)。请注意,从函数中释放
*str
后,您不应该从
main
读取或写入此内存位置,因为您现在无法对其进行篡改。

您会遇到崩溃,因为

*str[counter] = (char) character;

*(str[counter]) = (char) character;
相对于

(*str)[counter] = (char) character;
这正是你想要的。阅读您会发现
[]
*
(取消引用操作符)具有更高的优先级

此外,这里的强制转换以及对
realloc
malloc
的调用都是不必要的。不要忘记检查
realloc
malloc
等的返回值,看看它们是否成功分配了内存


现在,您有另一个问题:
free(str)应该是
free(*str)。请注意,从函数中释放
*str
后,您不应该从
main
读取或写入此内存位置,因为您现在无法对其进行篡改。

int readfromfile(FILE*filepointer,char**str)中
参数
char**str
实际上与
char*str[]
相同,这意味着
**str
需要一个字符指针数组。但是,您要传递给它的是
char*str
,它只是
char

当您使用readfromfile(…)时,您应该这样做(类似于…):

或:


int readfromfile(FILE*filepointer,char**str)
中,您会得到一个想法…

参数
char**str
实际上与
char*str[]
相同,这意味着
**str
需要一个字符指针数组。但是,您要传递给它的是
char*str
,它只是
char

当您使用readfromfile(…)时,您应该这样做(类似于…):

或:


你会想到…

永远不要强制转换malloc的结果。它会在添加更多字符时重新分配内存,不是吗?至于释放内存,我的歉意是,我只是测试检查它是否已被释放,现在已被编辑掉。你不需要为
malloc
@JJJ添加强制转换,是的,我没有看到
realloc
部分,对不起。永远不要强制转换malloc的结果。它会在添加更多字符时重新分配内存,尽管它不会?至于释放内存,我很抱歉刚才只是为了检查它是否被释放,现在被编辑掉了。你不需要为
malloc
@JJJ添加演员阵容,是的,我没有看到
realloc
部分,抱歉。非常感谢!我不敢相信丢失了一组括号会给我带来这么多麻烦,我一定要读一读。@JJJ这两个操作之间的差异可能看起来不是很强,但它是两个完全不同的操作,所以当然这两个操作会导致两个不同的结果。@Cool Guy啊,谢谢,现在已经摆脱了演员阵容,我也要加入realloc/malloc的检查。非常感谢!我不敢相信丢失了一组括号会给我带来这么多麻烦,我一定要读一读。@JJJ这两个操作之间的差异可能看起来不是很强,但它是两个完全不同的操作,所以当然这两个操作会导致两个不同的结果。@Cool Guy啊,谢谢,现在已经摆脱了强制转换,我也将添加realloc/malloc的检查。“这意味着
**str
需要一个字符指针数组”--不。它需要一个指向
char
(a
char**
)的指针。“但是您正在传递给它
char*str
,它只是一个
char
数组。”--否。OP正在传递
&str
,这是一个
字符**
,这正是
readfromfile
的第二个参数所要求的。“这意味着
**str
需要一个字符指针数组”--否。它需要一个指向
字符的指针(a
字符**
)“但是,您要传递给它的是
char*str
,它只是
char
的一个数组。”--不。OP传递的是
&str
,它是
char**
,这正是
readfromfile
的第二个参数所要求的。