此代码是不可移植的还是不安全的

时间:2013-07-19 22:12:39

标签: c malloc

我正在编写一些依赖于calloc的代码,并且想知道如果calloc失败则将指针重新指向堆栈空间是安全的,然后在调用free()之前将指针设置为NULL或者完全跳过它。     非常适合我的386 linux盒子。

char *str = NULL;
int usestackspace = 0;
char str1[16] = {0};

str = (char *)calloc(1, sizeof(pid_t));

if (str == NULL) {
    sleep(1);
    str = (char *)calloc(1, sizeof(pid_t));
}

if (str == NULL) {
    fprintf(stderr, "watchdog: %s\n", strerror(errno));
    usestackspace = 1;
    str = str1;
}

if (str == NULL) {
    return -1;
}

1 个答案:

答案 0 :(得分:2)

只要str1没有超出范围,您的代码就会非常好。你确实有一个真正的错误(应该生成一个警告,尽管它在运行时可能无关紧要):

  • str = &str1不是没有显式强制转换的有效作业。您可能需要str = str1

一个潜在的问题:

  • 如果您依赖于calloc隐含的内存设置为零,则需要初始化str1。例如,使用char str1[16] = { 0 }或致电memset

还有一些小调:

  1. 您不必在C程序中转换calloc的返回值。

  2. free(str)语句中有str = NULLif,但两者都是无操作 - if语句条件可确保str已经 NULL