0

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

所以原来是这样的

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

我已将其更改为

struct boo
{
    char *name;
    ...
}

所以这使得 name 动态分配存储名称实际需要的内存量。

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

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

4

3 回答 3

4

确保在创建结构时分配缓冲区比在使用结构的任何地方检查它要容易得多。一开始就不要让它为NULL!

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

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

于 2012-06-18T05:19:00.527 回答
1

if (name) 有效,但总是存在您的指针可能未初始化为 NULL 开始的问题。

如果您正在动态分配结构,为确保发生这种情况,请执行以下操作:

mystruct foo = calloc(sizeof(foo));

calloc 将内存归零。

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

assert(name);

如果名称为 NULL,这将在该行退出程序,但在“发布”版本中优化为无。

于 2012-06-18T05:18:34.053 回答
0

你的问题是当你检查返回分配成功时malloc

有些人喜欢使用xmalloc包装器来malloclibiberty库:

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

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

您还可以轻松编写自己的xmalloc函数:

void *xmalloc(size_t size)
{
    char *p = malloc(size);

    if (!p) {
         fprintf(stderr, "Error: allocation failure\n");
         exit(EXIT_FAILURE);
    }        

    return p;
}
于 2012-06-18T07:42:52.313 回答