我正在编写一些依赖于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;
}
答案 0 :(得分:2)
只要str1
没有超出范围,您的代码就会非常好。你确实有一个真正的错误(应该生成一个警告,尽管它在运行时可能无关紧要):
str = &str1
不是没有显式强制转换的有效作业。您可能需要str = str1
。一个潜在的问题:
calloc
隐含的内存设置为零,则需要初始化str1
。例如,使用char str1[16] = { 0 }
或致电memset
。还有一些小调:
您不必在C程序中转换calloc
的返回值。
free(str)
语句中有str = NULL
和if
,但两者都是无操作 - if
语句条件可确保str
已经 NULL
。