通过将char指针设置为NULL

时间:2015-08-04 21:15:54

标签: c pointers memory memory-management

****这个问题非常困惑,因为我在程序中遗漏了一些东西,但这个问题的答案很有见地(无论如何对我来说)。如果你遇到类似的问题,我建议你专注于答案而不是我的代码****

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

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

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;
}

3 个答案:

答案 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的检查。