【问题标题】:How to set a pointer to struct to NULL in C?如何在C中将指向结构的指针设置为NULL?
【发布时间】:2011-11-03 14:40:03
【问题描述】:

我有一个指向 struct 的指针数组,由于任何原因,当我打印这个数组时,它的末尾有一个备用元素,因此导致代码在末尾打印一个 NULL 字节。

反正我可以删除最后一块内存吗?

例如:

typedef struct
{
    char *name;
} B;

typedef struct
{
    B *var;
} A;

int main() {
    int num = 5; //for example
    A *foo = malloc(sizeof(A));
    B *bar = malloc(num * sizeof(B));
    for (int i = 0; i < num; i++) {
        bar[i] = *create_b(&bar[i]); // some function that works.
    }
    foo->var = bar;
    while (foo->var != NULL) {
        printf("This is %s\n",foo->var->name);
            foo->var++; 
    }
}

一切都打印得很好,但在循环结束时有一个不需要的打印。比如:

This is A
This is B
This is C
This is D
This is F
This is

显然数组只有 5 个元素,最后一个不打印任何内容。

【问题讨论】:

  • 如果它是一个char数组作为struct的成员,检查数组是否为空终止。它不应该打印它。除非您向我们展示您实际尝试的代码,否则很难弄清楚。
  • 数组中的数据你初始化了吗?
  • 你能给我们看一个有问题的代码示例吗?就像你如何定义数组、结构以及如何打印数组一样?
  • 您确定要遍历指针数组所具有的right amount 元素吗?
  • 我刚刚添加了代码:)

标签: c null


【解决方案1】:

您的打印循环是:

foo->var = bar;
while (foo->var != NULL) {
    printf("This is %s\n",foo->var->name);
    foo->var++; 
}

但是foo-&gt;var 永远不会等于 NULL,因为你只是在递增一个指针,所以你最终会读到bar 数组的末尾,你的应用程序可能会崩溃。

如果将while 循环替换为for (int i = 0; i &lt; num; i++),它将打印正确数量的元素。

【讨论】:

  • 这就是我要找的 :) 感谢您的回答。
【解决方案2】:

你不能做foo-&gt;var++,因为在设置为NULL的数组中没有位置。此外,使用 ++ 会更改 foo-&gt;var,因此循环后 foo-&gt;var 不再指向数组的开头,并且您无法再次访问数组。

您需要为一些数组结束标记分配内存,就像字符串有字符 \0 来标记字符串的结尾。

尝试以下方法:

int main() {
    int num = 5; //for example
    A *foo = malloc(sizeof(A));
    B *bar = malloc((num + 1) * sizeof(B));  // +1 for array terminator
    for (int i = 0; i < num; i++) {
        bar[i] = *create_b(&bar[i]); // some function that works.
    }
    bar[i].name = NULL;  // Use this as a marker to mean end of array
    foo->var = bar;
    for (B *tmp = foo->var; tmp->name != NULL; tmp++) {
        printf("This is %s\n",tmp->name);
    }
}

编辑代码中有一些错误。

【讨论】:

    【解决方案3】:

    你的问题可能出在你没有发布的函数create_b上。

    编辑:不,这可能是错误的,抱歉。

    但这肯定不是你想要的:

    bar[i] = *create_b(&bar[i]);
    

    你们都传入了 bar[i] 的地址并将其设置为等于返回值所指向的地址?

    【讨论】:

    • 它只为 'bar' 设置了一个名称,如您所见,它的打印结果正常。但是循环只从 0 到 num?
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2010-12-07
    • 2011-09-15
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多