从“char x [n]”转换为“char * x”后,有效/简单的方法来保护NULL?

时间:2012-06-18 05:09:06

标签: c

我最近对某些代码进行了更改,使char name字段动态化。

所以它最初就像

struct boo 
{
    char name[100];
    ...
}

我已将其更改为

struct boo
{
    char *name;
    ...
}

所以这个make name动态分配实际存储名称所需的内存量。

无论如何..此更改的结果将要求我在代码中的大约1000个位置添加if(boo->name)空指针检查。

所以只是想知道是否有任何智能或有效的方法(减少程序员开发时间)进行这种空指针检查。

3 个答案:

答案 0 :(得分:4)

确保在创建结构时分配缓冲区而不是在使用结构的任何地方检查缓冲区要容易得多。首先不要让它为NULL!

如果在获得相关数据之前需要将指针值放在结构中,则可以保留全局空字符串以专门用于此任务。在尝试free内存之前与此指针进行比较。

如果这是C ++而不是C,请认真考虑使用std::string而不是指针。

答案 1 :(得分:1)

if(name)是否有效,但总是存在一个问题,即你的指针可能无法初始化为NULL以开始。

如果你动态分配你的结构,为了确保发生这种情况,请执行:

mystruct foo = calloc(sizeof(foo));

calloc将内存归零。

编辑: 此外,如果您只想在调试版本中检查名称,则可以执行以下操作:

assert(name);

如果name为NULL,则会在该行退出程序,但在" release"生成。

答案 2 :(得分:0)

您的问题是在malloc时检查返回分配是否成功。

有些人喜欢使用xmalloc malloc来自libiberty库的xmalloc

  

- 替换:void * xmalloc(size_t)   永远分配内存。如果malloc失败,这将向stderr打印一条消息(使用xmalloc_set_program_name设置的名称,如果有的话),然后调用xexit。请注意,程序在其源代码中包含#define malloc xmalloc是安全的。

http://gcc.gnu.org/onlinedocs/libiberty/Functions.html

您也可以轻松编写自己的void *xmalloc(size_t size) { char *p = malloc(size); if (!p) { fprintf(stderr, "Error: allocation failure\n"); exit(EXIT_FAILURE); } return p; } 功能:

{{1}}