****这个问题非常困惑,因为我在程序中遗漏了一些东西,但这个问题的答案很有见地(无论如何对我来说)。如果你遇到类似的问题,我建议你专注于答案而不是我的代码****
我正在尝试编写一个程序,通过告知用户失败来处理内存分配失败,但要解决它。 (我知道在大多数情况下这不是正确的做法)。
我有一个结构。其结构变量之一是:
char* name;
在某些时候,我有以下行,动态地为这个变量分配内存并将其设置为某个输入:
if(object->name = calloc(1, strlen(input)+1)){
strcpy(object->name, input);
}
我想在calloc无法分配内存的情况下检查程序的行为。我写了一个测试,用以下代码替换了上面的代码:
object->name = NULL; //instead of the calloc
因为我认为如果无法分配内存,calloc将返回NULL。
然而,当我这样做时,我在该行上出现了分段错误。我认为这是因为我没有为object-> name分配内存。但是,这正是我的观点。我只想将指向char数组的指针设置为NULL。我想在程序后面的某个地方检查这个NULL指针并解决它。
如何在不获取分段错误的情况下将object->命名为NULL指针?
因为我上面没有提供足够的细节,所以这是实际的代码:
//disk is the "object" in question
if(disk_ptr = calloc (1, sizeof (disk))){
disk_created_successfully = set_or_fix_disk_static_attributes_test_all_is_null(&disk_ptr, name);
...
}
其中
bool set_or_fix_disk_static_attributes_test_all_is_null(disk** disk_ptr, char* name){
int success = true;
(*disk_ptr)->name = NULL;
// Code fails here
...
return success;
}
答案 0 :(得分:2)
要测试条件,您可以更改
if(object->name = calloc(1, strlen(input)+1)){
strcpy(object->name, input);
}
到
if (0) {
strcpy(object->name, input);
}
也就是说,您的原始代码正在检查分配是否成功。失败的结果是“假”是条件。
可能还有其他代码使用object->name
,所以更全面的测试是:
if (object->name = NULL) {
strcpy(object->name, input);
}
答案 1 :(得分:0)
您需要在调用calloc
后立即测试NULL指针。如果您在任何时候引用该NULL指针,那么您就会遇到麻烦。
在这种情况下,这将在您手动将指针设置为NULL之后。
答案 2 :(得分:0)
据我所知,如果object
分配了peroper内存,
object->name = NULL;
很好而且合法。但是,在这种情况下,在任何以后的任何时候,任何类似于
的代码 strcpy(object->name, input);
将是非法的,因为您实际上是在尝试写入无效的内存。通常,任何后续的读取和写入object->name
的访问都应该被阻止。
编辑:
我觉得你有点困惑。正如您的帖子所说,如果您尝试模拟calloc()
失败,那么您必须将disk_ptr
设置为NULL。然后,在set_or_fix_disk_static_attributes_test_all_is_null()
函数内部,指令
(*disk_ptr)->name = NULL;
变得无效,因为您将取消引用NULL指针。您可能希望首先针对NULL添加*disk_ptr
的检查。