gcc 4.4.4 c89
我有一个我正在测试的程序。我创建一个名为devname的结构对象并分配内存,以便我可以填充元素。我显示它们然后释放已分配的内存。
但是,我收到以下错误:
invalid operands to binary != (have ‘struct Devices_names’ and ‘void *’)
这是在我的for循环中显示结构元素。但是,我觉得我正在测试一个NULL指针。
还有一个问题,免费是否存在问题?
非常感谢任何建议,
#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++);
}
}
答案 0 :(得分:4)
由于您只有一个分配来创建整个devname
数组,因此您只需要检查该数组NULL
,并且只需要释放该数组。当您查看devname
时,每个条目实际上是struct Devices_names
,而不是指针,因此无法与NULL
进行比较或以任何有意义的方式释放。在这种情况下,您需要一个单独的变量来跟踪有多少条目:
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;
答案 1 :(得分:2)
devname[i]
不是指针struct Devices_names
,因此比较没有意义。
答案 2 :(得分:1)
你写的地方:
for(i = 0; devname[i] != NULL; i++) { <-- ERROR HERE
您正在针对NULL测试Device_names的实例,而不是指针。如果你有一个指向Device_names的指针数组就可以了。
另一个问题是你只分配了一个Device_names,所以你没有它们的数组。
答案 3 :(得分:1)
在calloc
之后,您只需要测试返回的指针是否为空(并且calloc
调用成功)。
但是一旦你calloc
一个数组,就无法确定分配中有多少只有指向它的项,所以devname[i] != NULL
和devname+i != NULL
都不起作用,而第二个将编译。只有环境或RTL知道这一点。这是*alloc
分配和静态声明之间的巨大差异(即使它在C99中引入了可变大小)。所以你需要在其他地方存储已分配数组的大小。
还要记住,使用单一calloc()
分配的数组(或任何其他内存块)应使用malloc返回的SAME指针进行单free()
次调用。将任何其他指针传递给free()
会导致未定义的行为(通常是FAIL)。
所以你的代码应该是:
static struct Devices_names {
#define MAX_NAME_LEN 80
int id;
char name[MAX_NAME_LEN];
} *devname;
size_t devicecount;
...
devname = calloc(devices, sizeof *devname);
if(devname == NULL) {
exit(0);
}
devicecount = devices;
...
for(i = 0; i<devicecount; i++) { // <-- no error more here
...
static void destroy_devices()
{
free(devname);
}