3

我正在编写一些依赖于 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;
}
4

1 回答 1

2

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

  • str = &str1不是没有显式强制转换的有效分配。你可能想要str = str1.

一个潜在的问题:

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

还有一些小注意事项:

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

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

于 2013-07-19T22:24:30.643 回答