我有这样的功能:
void readString(char* str){
str="asd";
}
我可以知道是否str
会被解除分配吗?还是我必须释放它?
注意:我在编写微处理器时不能使用字符串库。
free()
只能在或用于分配内存时malloc()
调用。发布的代码中不是这种情况,因此不需要调用。calloc()
realloc()
free()
这"asd"
是一个字符串文字,并在程序的生命周期内存在(具有静态存储持续时间)。
你的函数什么都不做。
它不会“读取”字符串。它所做的只是将字符串文字的地址(在某处初始化为字符串文本的常量内存块)分配给函数的局部变量str
。然后该函数退出,导致该局部变量停止存在。
什么都没有返回,并且指针没有被取消引用(这反过来又是错误的,因为它只是 a char *
,而不是 a char * *
),所以在函数之外没有任何事情发生。调用者没有“得到”任何值,因此没有什么可调用free()
的,所以这个问题甚至永远不会发生。
字符串不会被释放,因为它存储在静态内存中。你没有分配它,你没有释放它
就我而言,此代码无用且毫无意义。以下是调用函数定义的不同方式以及我为什么这么说!
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:代码中没有Fatal或Syntax错误,但这样做没有意义。唯一有意义的事情是,仅使用从调用者传递给您的函数的内容。在传递的参数上这样分配的原因是什么?您的定义可以只有一个局部变量并完全避免参数传递。该函数可以称为“readString();”...
void readString(void){
char *str='asd';
}
不,没有内存泄漏。在您的情况下,它是静态分配的。
一般来说,您必须制定自己的规则来决定谁可以或必须释放内存,并且您应该记录您的代码,以便清楚要求是什么。
在给出的示例中, readString()
只覆盖了它自己的私有指针副本,当它返回时,调用者将看不到任何改变。因此,调用者free()
对其指针的职责与调用之前相同readString()
,并且不会发生泄漏。
但是,如果readString()
改为接受 a char **
,以便它可以修改调用者的指针副本,那么结果将是在调用free()
之后调用是不合法的readString()
,因为指针的新值不是 malloc 堆的一部分。
如果该指针变量的先前值是一个malloc()
ed 对象,那么调用者应该在允许指针被覆盖之前释放它。readString()
在这种情况下调用真的很可怕free()
,因为它会将一个最终必须被释放的变量变成一个永远不能被释放的变量,并且程序流程将很难遵循。