【问题标题】:Invalid operands to binary - (have 'int' and 'int *')二进制的无效操作数 - (有 'int' 和 'int *')
【发布时间】:2020-05-19 16:52:03
【问题描述】:

我在运行程序时遇到问题:

二进制的无效操作数 - (有 'int' 和 'int *')

由于我定义了一个动态数组**engelCikacagiYer,然后我尝试对karakterHP进行操作

int karakterHP = 100;

int **engelCikacagiYer;

engelCikacagiYer = malloc(engelSayisi * sizeof(int));

for(i = 0; i < engelSayisi; i++){
    engelCikacagiYer[i] = (rand() % (100 - 5 + 1) + 5);
}

for(i = parkurUzunlugu.Baslangic; i < parkurUzunlugu.Bitis; i++){
    if (asal(engelCikacagiYer)) {
        karakterHP -= engelCikacagiYer[i];
        printf("%d\t", karakterHP);
    }
}

【问题讨论】:

  • engelCikacagiYer 的声明中删除一个* 可能就足够了。
  • 可能是第一个for 循环是问题所在。但是,假设您通过了这一点,engelCikacagiYer 是函数作用域,但在第二个for 循环中,您使用的是engeller.engelCikacagiYer。没有 [已发布] 代码将这两个变量关联(例如分配给/从)。那么,struct元素变量是如何初始化的呢?

标签: c dynamic-arrays


【解决方案1】:

这段代码:

int **engelCikacagiYer;

engelCikacagiYer = malloc(engelSayisi*sizeof(int));

不正确,将内存分配给双指针,也就是指向指针的指针,您需要使用它指向的大小进行分配,即指向 int 的指针,因此您需要:

engelCikacagiYer = malloc(engelSayisi*sizeof(int*));

或者更好:

engelCikacagiYer = malloc(engelSayisi*sizeof(*engelCikacagiYer));

稍后您尝试将int 值分配给engelCikacagiYer[i],这是一个指针变量而不是int 变量,因此出现错误。

如果你真的需要一个双指针,在第一个malloc之后你需要为每个engelCikacagiYer[i]指针分配内存:

for(int i = 0; i < engelSayisi; i++){
    engelCikacagiYer[i] = malloc(sizeof(**engelCikacagiYer));
}

并将值作为二维数组进行赋值(我的意思是使用相同的符号),例如:

engelCikacagiYer[i][0] = (rand()%(100-5+1)+5);

*engelCikacagiYer[i] = (rand()%(100-5+1)+5);

这是正确分配的简化可能实现:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int **engelCikacagiYer;

    engelCikacagiYer = malloc(100 * sizeof(*engelCikacagiYer)); //check allocation for errors

    for(int i = 0; i < 100; i++){
        engelCikacagiYer[i] = malloc(sizeof(**engelCikacagiYer)); //check allocation
        *engelCikacagiYer[i] = (rand() % (100 - 5 + 1) + 5);
    }

    for (int i = 0; i < 100; i++) //test print
    {
        printf("%d ", *engelCikacagiYer[i]);
    }
}

无论如何,对于您使用指向int 的单个指针呈现的代码也是一个有效(且更简单)的解决方案。

【讨论】:

  • 全部正确,并且赞成,但我怀疑 OP 实际上可能想要一个 int * 而不是 int **。这将导致一个稍微简单的解决方案,对原始代码的更改更少。
  • @JohnBollinger,既然你提到了,他很可能会这样做,但我希望不会:)
【解决方案2】:

int **engelCikacagiYer; 更改为int *engelCikacagiYer;

根据您的代码,您似乎想要一个动态整数数组,而不是动态整数指针数组。

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 2022-01-11
    • 2014-11-29
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多