我正在尝试创建一个函数,该函数将结构数组作为参数。到目前为止,这是我的代码的一部分:
#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);
}
编译程序时,会出现此警告:
警告:不兼容的指针类型传递 &#39; struct block(*)[64]&#39;参数类型&#39; struct block *&#39; [-Wincompatible指针类型] 显示(块);
我调查了这两个帖子并试了一下,但警告不断出现:
Passing an array of structs in C
How to pass an array of struct using pointer in c/c++?
有人可以向我解释我的计划有什么问题吗?
答案 0 :(得分:4)
struct block (*blocks)[MAXARR];
因此,blocks
是指向block
的数组的指针。
然后你打电话给display()
,如:
display(blocks);
其中,您将display()
定义为
void display(struct block *b)
仅使用block
指针。
根据您实施display()
的方式,这里有一些建议:
将void display(struct block *b)
更改为void display(struct block *b[])
以打印/访问所有元素blocks
。
而不是.
您需要使用->
运算符b
是指向block
的指针。
在main()
中,将blocks
声明为block *blocks[MAXARR];
,这意味着block
指针数组。请阅读this了解详情。
blocks = malloc(sizeof(struct block));
毫无意义。您需要单独malloc
每个block
个元素。像这样:
int i;
for(i = 0; i< MAXARR; i++) {
blocks[i] = (block *)malloc(sizeof(block));
}
您不需要blocks[i]->end = malloc(sizeof(bool));
。
完成所有这些后,您可以拨打display(blocks);
。
答案 1 :(得分:2)
struct block (*blocks)[MAXARR];
这会导致问题,因为它会创建一个指向struct block数组的指针。而你的函数需要一个指向struct block的指针。
void display(struct block *b);
因此,它给出了错误。
struct block *b;
将是正确的陈述。
答案 2 :(得分:0)
定义:
struct block * blocks;
而不是struct block (*blocks)[MAXARR]
。
答案 3 :(得分:-1)
我认为在动态分配内存时需要显式类型转换为struct指针。
blocks = (struct block *) malloc(sizeof(struct block));