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的返回值