我正在编写一些依赖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
还有几个小提示:
-
您不必在C程序中强制转换
calloc
的返回值。 -
if
语句中有free(str)
和str = NULL
,但它们都不是操作-if
语句条件确保str
已经为NULL
。