我有这样的功能:
void readString(char* str){
str="asd";
}
我是否可以知道str
是否会被解除分配?或者我必须释放它吗?
注意:我正在编写微处理器时无法使用字符串库。
答案 0 :(得分:5)
free()
,malloc()
或calloc()
用于分配内存时,才能调用{p> realloc()
。发布的代码不是这种情况,因此调用free()
是不需要的。
"asd"
是一个字符串文字,存在于程序的生命周期内(具有静态存储持续时间)。
答案 1 :(得分:3)
你的功能什么也没做。
它不会“读取”字符串。它只是将字符串文字的地址(一个常量的内存块,初始化为字符串的文本)分配给函数的局部变量str
。然后该函数退出,导致该局部变量停止存在。
没有返回任何内容,并且指针未被引用(这反过来又是错误的,因为它只是char *
,而不是char * *
),因此在函数外部没有任何反应。调用者不会“获取”任何值,因此无法调用free()
,因此问题永远不会发生。
答案 2 :(得分:2)
String不会被释放,因为它存储在静态内存中。你没有分配它,你没有释放它
答案 3 :(得分:0)
不,没有内存泄漏。在你的情况下,它是静态分配的。
答案 4 :(得分:0)
一般来说,你必须制定自己的关于谁可以或必须释放内存的规则,你应该记录你的代码,以便明确要求是什么。
在给出的示例中,readString()
仅覆盖其自己的指针私有副本,并且当它返回时,调用者将看不到任何已更改的内容。因此,调用者对其free()
指针的责任与调用readString()
之前的指针相同,并且不存在泄漏。
但是,如果readString()
代替接受了char **
,那么它可以修改调用者的指针副本,那么结果就是调用free()
是不合法的在调用readString()
之后,因为指针的新值不是malloc堆的一部分。
如果该指针变量的先前值是malloc()
ed对象,则调用者应该在允许指针被覆盖之前释放它。在这种情况下readString()
调用free()
会非常可怕,因为它会将一个最终必须释放的变量转换为一个永远不能被释放的变量,并且程序流程将很难跟随。
答案 5 :(得分:0)
就我而言,这段代码毫无用处且毫无意义。以下是调用函数定义的不同方法以及我为什么这么说!
int main (int argc, char *argv[], char *envp[])
{
char a, *b, *c;
b = malloc (10);
readString(&a); // Case-1, Valid calling.
readString(b); // Case-2, Valid calling.
readString(c); // Case-3, Invalid calling. Unallocated location.
}
案例1:这是唯一的案例,对于调用者来说,您在函数中执行的操作非常重要。您可以根据需要使用传递的字符。唯一有意义的任务就是这样。做'str =“asd”;'可能会转移核心或混乱调用者的堆栈或数据段内存(如果传递了全局变量的地址)并创建一个复杂的调试噩梦!
void readString(char* str){
*str='a';
}
案例2:代码中没有任何致命或语法错误,但这样做毫无意义。唯一有意义的事情就是,只使用从调用者传递给你的函数的东西。在传递的参数上分配这样的原因是什么?您的定义可以只有一个局部变量,并避免参数完全传递。该函数可以称为“readString();”...
void readString(void){
char *str='asd';
}