不兼容的指针类型警告

时间:2015-07-21 11:11:39

标签: c arrays pointers struct

我正在尝试创建一个函数,该函数将结构数组作为参数。到目前为止,这是我的代码的一部分:

#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++?

有人可以向我解释我的计划有什么问题吗?

4 个答案:

答案 0 :(得分:4)

struct block (*blocks)[MAXARR];

因此,blocks是指向block的数组的指针。

然后你打电话给display(),如:

display(blocks);

其中,您将display()定义为

void display(struct block *b)

仅使用block指针。

根据您实施display()的方式,这里有一些建议:

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

  2. 而不是.您需要使用->运算符b是指向block的指针。

  3. main()中,将blocks声明为block *blocks[MAXARR];,这意味着block指针数组。请阅读this了解详情。

  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));

  6. 完成所有这些后,您可以拨打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));