不兼容的指针类型警告

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) 的参数;

我查看了这两个帖子并进行了尝试,但无论如何警告仍然出现:

在 C 中传递结构数组

c++ - 如何在c/c++中使用指针传递结构数组?

有人可以向我解释我的程序有什么问题吗?

rak*_*rul 5

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(),这里有一些建议给您:

  1. 更改void display(struct block *b)void display(struct block *b[])打印/访问所有元素blocks

  2. 而不是.您需要使用->运算符作为b指向block.

  3. main(),声明blocksblock *blocks[MAXARR];这意味着一个block指针数组。阅读本文了解更多信息。

  4. blocks = malloc(sizeof(struct block));没有意义。您需要单独处理malloc每个block元素。像这样的东西:

    int i; for(i = 0; i< MAXARR; i++) { blocks[i] = (block *)malloc(sizeof(block)); }

  5. 你不需要blocks[i]->end = malloc(sizeof(bool));

完成所有这些之后,您可以调用display(blocks);.