New*_*mer 1 c arrays struct pointers
我正在尝试创建一个将结构数组作为参数的函数。到目前为止,这是我代码的一部分:
#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);
}
Run Code Online (Sandbox Code Playgroud)
当我编译程序时,出现此警告:
警告:不兼容的指针类型将 'struct block (*)[64]' 传递给类型为 'struct block *' [-Wincompatible-pointer-types] display(blocks) 的参数;
我查看了这两个帖子并进行了尝试,但无论如何警告仍然出现:
有人可以向我解释我的程序有什么问题吗?
struct block (*blocks)[MAXARR];
Run Code Online (Sandbox Code Playgroud)
所以,blocks是一个指向block's数组的指针。
然后你打电话给display():
display(blocks);
Run Code Online (Sandbox Code Playgroud)
其中,你定义display()为
void display(struct block *b)
Run Code Online (Sandbox Code Playgroud)
block它只需要一个指针。
根据您的实施方式display(),这里有一些建议给您:
更改void display(struct block *b)为void display(struct block *b[])打印/访问所有元素blocks。
而不是.您需要使用->运算符作为b指向block.
在main(),声明blocks为block *blocks[MAXARR];这意味着一个block指针数组。阅读本文了解更多信息。
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);.