Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不兼容指针类型警告_C_Arrays_Pointers_Struct - Fatal编程技术网

C 不兼容指针类型警告

C 不兼容指针类型警告,c,arrays,pointers,struct,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

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

#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);
}
#包括
#包括
#包括
#包括
#定义MAXREAD 256
#定义MAXARR 64
结构块{
无炭;
布尔端;
};
无效显示(结构块*b){
char*p;
printf(“|”);
对于(int i=0;iend?“真”:“假”);
}
printf(“\n”);
}
int main(){
字符输入[MAXREAD];
结构块(*块)[MAXARR];
char-cmd;
整数;
块=malloc(sizeof(struct block));
char*a;
//int*m;
对于(int i=0;ifree='\0';
块[i]->end=malloc(sizeof(bool));
块[i]->end=false;
}
块[MAXARR-1]->end=true;
显示(块);
while(strcmp(输入,“q”)!=0){
printf(“要分配/释放多少块?\n”);
fgets(输入、最大读取、标准输入);
a=strchr(输入“\n”);
*a='\0';
sscanf(输入,“%c%d”、&cmd和编号);
if(strhr(输入'q')){
打破
}else if(strhr(输入'a')){
alloc(块数);
}else if(strhr(输入'f')){
解除锁定(块数);
}
显示(块);
}
出口(0);
}
编译程序时,会显示以下警告:

警告:不兼容的指针类型正在传递 “struct block(*)[64]”到类型为“struct block*”的参数 [-Wincompatible指针类型] 显示(块)

我查看了这两篇文章,并尝试了一下,但警告始终出现:

有人能给我解释一下我的程序有什么问题吗?

定义一下:

struct block * blocks;
代替
struct block(*blocks)[MAXARR]

定义以下内容:

struct block * blocks;
struct block (*blocks)[MAXARR];
而不是
struct block(*blocks)[MAXARR]

struct block (*blocks)[MAXARR];
因此,
是指向
数组的指针

然后调用
display()
如下:

display(blocks);
其中,您将
display()
定义为

void display(struct block *b)
它只接受
指针

根据您如何实现
display()
,以下是一些建议:

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

  • 您需要使用
    ->
    操作符,而不是
    ,因为
    b
    是指向
    块的指针

  • main()
    中,将
    block
    声明为
    block*blocks[MAXARR];
    表示
    block
    指针数组。有关详细信息,请阅读

  • blocks=malloc(sizeof(struct block));
    没有任何意义。您需要将
    malloc
    每个
    block
    元素单独设置。如下所示:

    inti;
    对于(i=0;i

  • 您不需要
    块[i]->end=malloc(sizeof(bool));

  • 完成所有这些操作后,您可以调用
    display(blocks);

    因此,
    是指向
    数组的指针

    然后调用
    display()
    如下:

    display(blocks);
    
    其中,您将
    display()
    定义为

    void display(struct block *b)
    
    它只接受
    指针

    根据您如何实现
    display()
    ,以下是一些建议:

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

  • 您需要使用
    ->
    操作符,而不是
    ,因为
    b
    是指向
    块的指针

  • main()
    中,将
    block
    声明为
    block*blocks[MAXARR];
    表示
    block
    指针数组。有关详细信息,请阅读

  • blocks=malloc(sizeof(struct block));
    没有任何意义。您需要将
    malloc
    每个
    block
    元素单独设置。如下所示:

    inti;
    对于(i=0;i

  • 您不需要
    块[i]->end=malloc(sizeof(bool));

  • 完成所有这些操作后,您可以调用
    display(blocks);

    这会导致问题,因为它会创建指向结构块数组的指针。而您的函数需要指向结构块的指针

    void display(struct block *b);
    
    因此,它给出了错误

    struct block *b;
    
    这将是正确的陈述

    这会导致问题,因为它会创建指向结构块数组的指针。而您的函数需要指向结构块的指针

    void display(struct block *b);
    
    因此,它给出了错误

    struct block *b;
    

    将是正确的语句。

    我认为动态分配内存时需要显式类型转换为结构指针。
    blocks=(struct block*)malloc(sizeof(struct block));

    我认为动态分配内存时需要显式类型转换到结构指针。
    blocks=(struct block*)malloc(sizeof(struct block));
    struct block(*blocks)[MAXARR];
    …hhmmmstruct block(*blocks)[MAXARR];此语句被理解为“blocks是指向MAXARR size的struct block类型数组的指针”。您需要将显示函数的签名更改为void display(struct block(*b)[]或无效显示(结构块**b)将
    声明为指向
    结构块
    的64个指针数组。然后使用
    malloc
    分配一个大小等于一个
    struct块
    的内存块,并将其分配给
    。这是错误的。
    已分配给堆栈,并且大小为64个指针。您应该为for循环中的每个
    块[i]
    分配一个内存块。但这不是您唯一的问题。1)始终检查malloc()、sscanf()、alloc()和de的返回值