通过将char指针设置为NULL模拟calloc失败

通过将char指针设置为NULL模拟calloc失败,c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,****这个问题非常混乱,因为我在我的程序中遗漏了一些东西,但这个问题的答案很有洞察力(对我来说)。如果您有类似的问题,我建议您关注答案,而不是我的代码**** 我正试图编写一个程序,通过通知用户内存分配失败,并解决它来处理内存分配失败。(我理解在大多数情况下,这不是正确的做法) 我有一个结构。其结构变量之一是: char* name; 在某个时刻,我有下面一行,为这个变量动态分配内存并将其设置为一些输入: if(object->name = calloc(1, strlen(input

****这个问题非常混乱,因为我在我的程序中遗漏了一些东西,但这个问题的答案很有洞察力(对我来说)。如果您有类似的问题,我建议您关注答案,而不是我的代码****

我正试图编写一个程序,通过通知用户内存分配失败,并解决它来处理内存分配失败。(我理解在大多数情况下,这不是正确的做法)

我有一个结构。其结构变量之一是:

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。我想稍后在程序中的某个地方检查这个空指针并解决它

如何使object->name成为空指针而不出现分段错误


因为我没有在上面包含足够的细节,这是实际的代码:

 //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);
        ...
}
在哪里


您需要在调用
calloc
后立即测试空指针。如果在任何点引用空指针,都是自找麻烦


在这种情况下,就在您手动将指针设置为NULL的点之后。

从您的代码段中可以看出,如果每个内存分配了
对象

 object->name = NULL;
这是罚款和合法的。然而,在这种情况下,在以后的任何时候,任何类似于

 strcpy(object->name, input);
将是非法的,因为您实际上是在试图写入无效内存。通常,应该阻止对
object->name
的任何后续读写访问


编辑:

我觉得你有点困惑。正如您的帖子所说,如果您试图模拟
calloc()
故障,那么您必须将
磁盘ptr
设置为空。然后,在
set\u或\u fix\u disk\u static\u attributes\u test\u all\u is\u null()函数中,指令

(*disk_ptr)->name = NULL;

正在变得无效,因为您将取消引用空指针。您可能需要先添加一个针对NULL的
*磁盘\u ptr
检查。

要测试该条件,您可以更改

if(object->name = calloc(1, strlen(input)+1)){
    strcpy(object->name, input);
}

也就是说,您的原始代码正在检查分配是否成功。它失败的结果是“false”是条件

可能还有其他代码使用
object->name
,因此更全面的测试是:

if (object->name = NULL) {
    strcpy(object->name, input);
}

我读了你问题的最后一句话,重新读了一遍,但我还是不知所措-(实际上,您期望的区别是什么?对不起,稍后将进行编辑。我明白您的意思。或者,我们这里缺少一件简单的事情,即在执行
object->name=NULL;
时,
object
本身为NULL或无效?我认为最好显示设置NULL值的位置。我怀疑您是在中这样做的de>if
因此会在
strcpy中写入未分配的内存,或者在这种特殊情况下造成其他类似的“混乱”@Amit,
if()
将阻止
strcpy()
,但我们不知道完整的代码。是的-我在代码后面使用了object->name,没有检查NULL。谢谢。顺便说一句,不要把
=
=
混淆。我们没有将
object->name
NULL
进行比较,事实上我们没有隐式地比较任何东西。这种情况下的行为是这样的
if()
语句将传递任何非零的内容。假定
NULL
指针在算术上等于0,那么
if()
语句将不会传递
object->name
NULL
if (0) {
    strcpy(object->name, input);
}
if (object->name = NULL) {
    strcpy(object->name, input);
}