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



我正在编写一些依赖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: %sn", strerror(errno));
    usestackspace = 1;
    str = str1;
}
if (str == NULL) {
    return -1;
}

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

  • 如果没有显式强制转换,str = &str1不是有效的赋值。你可能想要str = str1

一个潜在问题:

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

还有几个小提示:

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

  2. if语句中有free(str)str = NULL,但它们都不是操作-if语句条件确保str已经NULL

相关内容

  • 没有找到相关文章

最新更新