Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
像这样使用malloc是正确的吗?_C_Malloc_Free - Fatal编程技术网

像这样使用malloc是正确的吗?

像这样使用malloc是正确的吗?,c,malloc,free,C,Malloc,Free,我不熟悉动态内存分配。 这种类型的使用是否会导致内存泄漏或未分配的内存访问 char *func2(char *str) { //Do something like writing 10 characters to str return str; } void func1() { char *str = NULL, *res; int len = 10; str = (char *)malloc(len * sizeof(char)); res

我不熟悉动态内存分配。 这种类型的使用是否会导致内存泄漏或未分配的内存访问

char *func2(char *str) {
    //Do something like writing 10 characters to str
    return str;
}

void func1() {
    char *str = NULL, *res;
    int len = 10;
    str = (char *)malloc(len * sizeof(char));
    res = func2(str);
    free(str); 
    printf("%s", res);
}

func1
中的最终printf语句是否会导致分段错误,因为
str
已被释放,
res
将是一个悬空指针,没有指向的内存位置?

res
在其引用的内存被释放后使用。这是未定义的行为,可能导致也可能不会导致运行时错误。毕竟,未定义的行为是未定义的


实际上,我认为可能发生的情况是,您的程序将愉快地打印内存中的任何内容
res
指向的内容。记忆并没有消失,你只是说你不会再使用它了。内存中的内容是未初始化的垃圾,因为您从未向它写入任何内容。我想你会得到gobbledygook的输出。

是的,这是一个错误。我们可以通过将代码转换为工作示例并在Valgrind下运行来演示错误:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *func2(char *str)
{
    strcpy(str, "hello!");
    return str;
}

int main()
{
    char *str, *res;
    int len = 10;
    str = malloc(len);
    res = func2(str);
    free(str);
    printf("%s", res);
}
它告诉我们第18行的printf试图从第17行释放的内存中读取。此外,它还表明所讨论的内存是在第15行分配的


这个故事的寓意是,当您使用完内存后(而不是之前),您应该释放内存。如果您不清楚您的函数是否拥有指针中传递给它们的内存,则很难做到这一点。

。在您的示例中,“执行类似于向str添加10个字符的操作”可能会使缓冲区溢出,因为您只分配了总共10个字符作为开始。最后,释放已经释放的指针是不好的。是的,你会得到垃圾。这就是为什么它几乎总是迫使程序在被访问时崩溃。除了:考虑<代码> STR=Malc(SsieOf*STR*LEN);<代码>而不是
str=(char*)malloc(len*sizeof(char))。更容易编码、查看和维护。@iRove:当然,在释放后将
str
设置为
NULL
在这里没有什么区别,因为它不会为NULL
res
@fredrarson是的……但我只是想说明释放后使用任何变量的危险性(当然,除非你重新初始化它)。所以我应该在res的使用完成后才释放str?
void func1(){char*str=NULL,*res;int len=10;res=func2(str,len);printf(“%s”,res);}
现在我想让func2在malloc中输入长度为'len'的字符,在
str
中写入一些字符,使
res
指向
str
,free
str
并返回res。我该怎么做呢?我不知道你为什么要费心用
str
来做这件事。为什么不干脆
malloc
,填充并返回结果呢?这可能会有问题看起来很像。实际上,内存可能会消失(未映射),这取决于目标平台上如何实现
free()
。但您所说的是在编写本文时广泛使用的系统上可能出现的结果。