确定C中来自主线程的pthread_create中的参数是否为NULL

时间:2016-05-16 02:19:56

标签: c multithreading pthreads

我试图弄清楚传递给pthread_create的指针是否为NULL且已被释放。但是,在下面的代码中,idx仍然包含内存地址,即$1 = (int *) 0x601010

有没有办法确定idx是否已被释放且是否为空?

#include <pthread.h>

void *foo(void *i) {
    int a = *((int *) i); 
    free(i);
    i = NULL;
}

int main() {
    pthread_t thread;
    int *idx = malloc(sizeof(*idx));
    pthread_create(&thread, 0, foo, (void *) idx);
    pthread_detach(thread);
    sleep(10);
    // if (idx == NULL) // contains (int *) 0x601010
    // puts("done");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

请记住,在C语言中,所有函数调用参数都是按值传递的,所以从来没有,从来没有,free() d的指针永远不会为空,但是如果你做了它的值,那么免费通话后。

当你这样做时

void *p = malloc(100);
...
free(p);

然后检查p的值,它与调用free(3)之前的值相同,因为你唯一可以做的就是强制它NULL来明确指定它那个价值。像这样:

free(p); p = NULL;

请记住,在free(3)中失败的唯一方法是将它传递给非分配指针,这通常会挂起程序(未定义的行为)所以,如果你想确保指针不可用,只需为其分配NULL