【发布时间】:2015-10-10 19:28:51
【问题描述】:
我正在尝试创建一个将结构数组作为参数的函数。到目前为止,这是我的代码的一部分:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define MAXREAD 256
#define MAXARR 64
struct block {
char free;
bool end;
};
void display(struct block *b){
char *p;
printf("|");
for(int i=0; i<MAXARR; i++){
p = &b[i].free;
//printf("%c ", *p);
printf("%c", (*p != '\0' ? '#':'-'));
//printf("%d", p);
if(b[i].end){
//printf("%d\n", i);
printf("|");
}
//printf("%c", blocks[i]->end ? "true":"false");
}
printf("\n");
}
int main(){
char input[MAXREAD];
struct block (*blocks)[MAXARR];
char cmd;
int number;
blocks = malloc(sizeof(struct block));
char *a;
//int *m;
for(int i=0; i<MAXARR; i++){
blocks[i]->free = '\0';
blocks[i]->end = malloc(sizeof(bool));
blocks[i]->end = false;
}
blocks[MAXARR-1]->end = true;
display(blocks);
while(strcmp(input, "q") != 0){
printf("How many blocks do you want to allocate/free?\n");
fgets(input, MAXREAD, stdin);
a = strchr(input, '\n');
*a = '\0';
sscanf(input, "%c %d",&cmd, &number);
if(strchr(input, 'q')){
break;
} else if(strchr(input, 'a')){
alloc(number, blocks);
} else if(strchr(input, 'f')){
dealloc(number, blocks);
}
display(blocks);
}
exit(0);
}
当我编译程序时,会出现这个警告:
警告:不兼容的指针类型传递 'struct block (*)[64]' 到 'struct block *' 类型的参数 [-Wincompatible-pointer-types] 显示(块);
我查看了这两个帖子并进行了尝试,但警告始终显示:
Passing an array of structs in C
How to pass an array of struct using pointer in c/c++?
有人可以向我解释一下我的程序有什么问题吗?
【问题讨论】:
-
struct block (*blocks)[MAXARR];...hhmmmm -
结构块 (*blocks)[MAXARR];这条语句理解为“blocks 是一个指向 MAXARR 大小的 struct block 类型数组的指针”。您需要将 display 函数的签名更改为 void display(struct block (*b)[]) 或 void display(struct block **b)
-
您将
blocks声明为一个由64 个指向struct block的指针组成的数组。然后使用malloc分配一块大小等于struct block的内存块并将其分配给blocks。这是错误的。blocks已分配到堆栈,大小为 64 个指针。相反,您应该为 for 循环内的每个block[i]分配一块内存。不过,这不是您唯一的问题。 -
1) 始终检查 malloc()、sscanf()、alloc()、dealloc()、fgets()、strchr() 的返回值,以确保操作成功。 2) 在将任何特定内容放入“input”之前,正在检查“input”的第一个字符的内容是否为“q”。顺便说一句:alloc() 和 dealloc() 的原型在 alloc.h 中,代码中没有
-
当 #define'ing 一个数值时,总是将该值包含在括号中以避免文本替换错误。为了我们人类的可读性,请在代码块之间插入一个空行。该代码正在为“q”搜索“输入”并比较“q”的第一个字符,建议使用“cmd”变量。其中包含读取的数据行的第一个字符。