C:警告:赋值使指针从整数开始而没有强制转换[默认启用]

时间:2018-12-17 12:06:38

标签: c pointers

对于C来说,这是一个相当新的东西,对于我在此函数中收到的警告感到困惑:

void fillPrioritiesArr(int ** priorities, int arrSize) { 
  int currIdx = 0;
  while(currIdx < arrSize){
    priorities[currIdx]=malloc(sizeof(int));
    priorities[currIdx] = (int) rand() % 10;
    currIdx++;
  }
}

特别是这一行:

priorities[currIdx] = (int) rand() % 10;

是因为一个指针变量而另一个是int变量吗?还是我对此的理解是完全错误的?

3 个答案:

答案 0 :(得分:0)

尝试

void fillPrioritiesArr(int ** priorities, int arrSize) { 
  int currIdx = 0;
  while(currIdx < arrSize){
    priorities[currIdx]=malloc(sizeof(int));
    *priorities[currIdx] = (int) rand() % 10;
    currIdx++;
  }
}

答案 1 :(得分:0)

在线

priorities[currIdx] = (int) rand() % 10;

您正在尝试将int右侧(rhs)上的=分配给左侧类型为int*的内容( lhs)。 lhs是一个变量,该变量持有一个指向可以存储int的存储位置的指针。因此,为了写入该位置,您首先必须使用*priorities[currIdx]取消引用指针变量。这告诉编译器:“不要写变量本身,而要查找它指向的位置并在那里写。”

这与您一开始说priorities[currIdx]时的操作类似。变量prioritiesint**。这是指向int的指针。您不想覆盖变量本身,而是想要使用新的指针写其指向的位置(类型为int*)。在这种情况下,您会取消引用priorities[currIdx]的意思,这等同于*(priorities + currIdx)


但是,为数组的每个插槽分配额外的int不仅不必要而且麻烦,而且还会使您的代码慢得多。您只需直接传递int就可以直接拥有一个int* priorities数组。 然后,您只需将malloc行放在一起并像最初在问题中一样写入数组即可。也就是说,无需取消引用:

priorities[currIdx] = (int) rand() % 10;

因为priorities[currIdx]的类型为int

答案 2 :(得分:-1)

priorities [currIdx]是整数指针类型。您无法将int分配给地址。

执行以下操作:

int temp = (int) rand()%10;

memcpy(priorities [currIdx], &temp, sizeof(int);