像这样使用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
在这里没有什么区别,因为它不会为NULLres
@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
,freestr
并返回res。我该怎么做呢?我不知道你为什么要费心用str
来做这件事。为什么不干脆malloc
,填充并返回结果呢?这可能会有问题看起来很像。实际上,内存可能会消失(未映射),这取决于目标平台上如何实现free()
。但您所说的是在编写本文时广泛使用的系统上可能出现的结果。