首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用calloc和freeing分配内存

使用calloc和freeing分配内存
EN

Stack Overflow用户
提问于 2010-11-30 16:37:55
回答 4查看 25.8K关注 0票数 3

gcc 4.4.4 c89

我有一个正在测试的程序。我创建了一个名为devname的struct对象,并分配内存以便填充元素。我显示它们,然后释放分配的内存。

但是,我得到了以下错误:

代码语言:javascript
运行
复制
invalid operands to binary != (have ‘struct Devices_names’ and ‘void *’)

这是在我的for循环中,用于显示结构元素。但是,我觉得我是在测试空指针。

再问一个问题,免费有问题吗?

非常感谢你的建议,

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>

static struct Devices_names {
#define MAX_NAME_LEN 80
    int id;
    char name[MAX_NAME_LEN];
} *devname;

static void g_create_device_names(size_t devices);
static void g_get_device_names();
static void destroy_devices();

int main(void)
{
#define DEVICES 5
    g_create_device_names(DEVICES);

    g_get_device_names();

    destroy_devices();

    return 0;
}

static void g_create_device_names(size_t devices)
{
    size_t i = 0;
    devname = calloc(devices, sizeof *devname);
    if(devname == NULL) {
        exit(0);
    }

    for(i = 0; i < devices; i++) {
        devname[i].id = i;
        sprintf(devname[i].name, "device: %d", i);
    }
}

static void g_get_device_names()
{
    size_t i = 0;

    for(i = 0; devname[i] != NULL; i++) { <-- ERROR HERE
        printf("Device id --- [ %d ]\n", devname[i].id);
        printf("Device name - [ %s ]\n", devname[i].name);
    }
}

static void destroy_devices()
{
    while(devname != NULL) {
        free(devname++);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-30 16:43:24

由于您只有一次分配来创建整个devname数组,因此您只需要检查该数组中的NULL,并且只需要释放该数组。当您浏览devname时,每个条目实际上都是一个struct Devices_names,而不是一个指针,所以它不能与NULL进行比较,也不能以任何有意义的方式释放。在这种情况下,您需要一个单独的变量来跟踪有多少个条目:

代码语言:javascript
运行
复制
for (i = 0; i < devname_count; i++) {
    printf("Device id --- [ %d ]\n", devname[i].id);
    printf("Device name - [ %s ]\n", devname[i].name);
}

...

free(devname);
devname = NULL;
devname_count = 0;
票数 4
EN

Stack Overflow用户

发布于 2010-11-30 16:44:42

devname[i]不是一个指针,它是一个struct Devices_names,因此比较没有意义。

票数 2
EN

Stack Overflow用户

发布于 2010-11-30 16:44:57

你在哪里写:

代码语言:javascript
运行
复制
for(i = 0; devname[i] != NULL; i++) { <-- ERROR HERE

您测试的是空的Device_names实例,而不是指针。如果您有一个指向Device_names的指针数组,那就很好了。

另一个问题是您只分配了一个Device_names,所以没有它们的数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4311868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档