C语言 在使用函数之前将数据加载到函数的静态内存中是不是一种坏的做法?

dy2hfwbg  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

标题可能无法清楚地表达我的意思,所以让我给予你一个例子:

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应用程序中处理异步事件时。
这是否被视为不良做法/是否存在风险?

6yt4nkrj

6yt4nkrj1#

这是否被视为不良做法/是否存在风险?
这是一个不好的做法(如所写的),至少有两个原因:

  • 它是线程敌对的--在多线程程序中无法安全地使用myFunc
  • 它很容易导致使用悬空指针。

请考虑:

void foo()
{
  char c[] = "Hello";
  myFunc(c);
}

字符串
如果foo是对myFunc的第一次调用,那么myFunc将保留一个指向c的指针,一旦foo返回,该指针将无效。
为了使其稍微安全一点(但仍然是线程敌对的),您可以复制str

void myFunc (char * str) {
    static char * str_inside;

    // Load data into the static variable
    if (str != NULL) {
        str_inside = strdup(str);
        return;
    }
...


要使此线程兼容(至少对于现代C版本),请执行以下操作:

void myFunc (char * str) {
    static char * str_inside = strdup(str);  // strdup only called once.
...

igetnqfo

igetnqfo2#

在使用函数之前将数据加载到函数的静态内存中是不是一种坏的做法?
练习的时候,

  • 当加载到静态数据中时,(=)足以复制代码生命周期内所需的所有数据。指针是一个问题,因为指针的有效生命周期通常是有限的,并且它指向的对象往往不会持续代码的生命周期。
  • 对于多线程,读取静态变量需要以防止并发访问的方式进行。

相关问题