标题可能无法清楚地表达我的意思,所以让我给予你一个例子:
void myFunc (char * str) {
static char * str_inside;
// Load data into the static variable
if (str != NULL) {
str_inside = str;
return;
}
/* do stuff with str_inside in consecutive calls */
}
void doStuff () {
// Calls the function, which has data already loaded
myFunc (NULL);
}
int main () {
char str[] = "Hello!";
// Load data into the function
myFunc (str);
doStuff ();
}
字符串
这是因为doStuff可能无法访问原始字符串。例如,在GUI应用程序中处理异步事件时。
这是否被视为不良做法/是否存在风险?
2条答案
按热度按时间6yt4nkrj1#
这是否被视为不良做法/是否存在风险?
这是一个不好的做法(如所写的),至少有两个原因:
myFunc
请考虑:
字符串
如果
foo
是对myFunc
的第一次调用,那么myFunc
将保留一个指向c
的指针,一旦foo
返回,该指针将无效。为了使其稍微安全一点(但仍然是线程敌对的),您可以复制
str
:型
要使此线程兼容(至少对于现代
C
版本),请执行以下操作:型
igetnqfo2#
在使用函数之前将数据加载到函数的静态内存中是不是一种坏的做法?
练习的时候,
=
)足以复制代码生命周期内所需的所有数据。指针是一个问题,因为指针的有效生命周期通常是有限的,并且它指向的对象往往不会持续代码的生命周期。