【问题标题】:incompatible pointer types warning不兼容的指针类型警告
【发布时间】:2015-10-10 19:28:51
【问题描述】:

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

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

当我编译程序时,会出现这个警告:

警告:不兼容的指针类型传递 'struct block (*)[64]' 到 'struct block *' 类型的参数 [-Wincompatible-pointer-types] 显示(块);

我查看了这两个帖子并进行了尝试,但警告始终显示:

Passing an array of structs in C

How to pass an array of struct using pointer in c/c++?

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

【问题讨论】:

  • struct block (*blocks)[MAXARR];...hhmmmm
  • 结构块 (*blocks)[MAXARR];这条语句理解为“blocks 是一个指向 MAXARR 大小的 struct block 类型数组的指针”。您需要将 display 函数的签名更改为 void display(struct block (*b)[]) 或 void display(struct block **b)
  • 您将blocks 声明为一个由64 个指向struct block 的指针组成的数组。然后使用malloc 分配一块大小等于struct block 的内存块并将其分配给blocks。这是错误的。 blocks 已分配到堆栈,大小为 64 个指针。相反,您应该为 for 循环内的每个 block[i] 分配一块内存。不过,这不是您唯一的问题。
  • 1) 始终检查 malloc()、sscanf()、alloc()、dealloc()、fgets()、strchr() 的返回值,以确保操作成功。 2) 在将任何特定内容放入“input”之前,正在检查“input”的第一个字符的内容是否为“q”。顺便说一句:alloc() 和 dealloc() 的原型在 alloc.h 中,代码中没有
  • 当 #define'ing 一个数值时,总是将该值包含在括号中以避免文本替换错误。为了我们人类的可读性,请在代码块之间插入一个空行。该代码正在为“q”搜索“输入”并比较“q”的第一个字符,建议使用“cmd”变量。其中包含读取的数据行的第一个字符。

标签: c arrays pointers struct


【解决方案1】:
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. 您需要使用-&gt; 运算符而不是.,因为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]-&gt;end = malloc(sizeof(bool));

所有这些,你可以打电话给display(blocks);

【讨论】:

  • 在所有对malloc()的调用之后,在退出程序之前,需要将malloc()中的每个指针传递给free()以避免内存泄漏。
【解决方案2】:
struct block (*blocks)[MAXARR];

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

void display(struct block *b);

因此,它给出了错误。

struct block *b;

将是正确的陈述。

【讨论】:

  • @NewbieProgrammer,你确定成功了?你对display() 的实现说点别的。
  • @rakeb.void 我也想知道。这段代码有很多错误,不可能仅仅通过这个更改就可以工作。
  • @axxis,是的,除非 OP 发生很大变化,否则代码将永远无法工作。
  • @rakeb.void 是的,它甚至不会编译我只是指出了特定的错误。
  • @ameyCU,但您指出的解决方案实际上并不正确,因为 OP 试图显示所有 blocks(实现是这样说的)。但是您的方法可以消除警告!干杯!
【解决方案3】:

定义这个:

struct block * blocks;

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多