在C语言中,我有一个函数,其中将字符串作为参数,然后在使用它之后销毁它,因为我必须在无限循环中调用它,并且5分钟后,进程返回了-1073741819(0xC0000005)。
这是我的职能
void renderText(char *text) {
//use it here and then destroy it.
*text = NULL; //not working!
text = NULL; //also not!
text[0] = '\0'; //also not!
}
将参数传递为:
renderText("Hello There!");
我可以使用
malloc()
函数创建一个字符串,然后可以传递给上面的函数,但是我必须无限次调用它,以便在调用指针时该函数中可以使用任何方法将其为NULL通过引用。
答案 0 :(得分:6)
此行
text[0] = '\0';
将取消引用指针text
,但您已经
text = NULL;
所以这可能会导致段错误。你可以
free(text);
,但最好由调用者负责。这使得该函数对于动态分配了 的参数或调用者想再次使用的参数更加有用。
但是您的具体用法是
renderText("Hello There!");
,并且字符串文字不能更改:它是只读的。因此,您的函数绝对不能尝试杀死传递的参数。
答案 1 :(得分:2)
这里
void renderText(char *text) { }
text
是char*
类型的,并且在使用它之后,不要将text
指向任何无效的存储位置,始终最好使用NULL
进行初始化,这意味着它指向一无所有。因此,
text = NULL;
仅在此API中正确,因为它无法反映调用函数中的NULL
分配,因为text
是在此函数中本地创建的。
这个
*text = NULL;
无效,因为*text
是char
类型,而NULL
等效于(void*)0
。
此
text[0] = '\0';
如果根据上述声明进行错误处理,则可以正常工作。对于例如
if(strlen(text) != 0) { /* something is there inside text */ }