簡體   English   中英

C:警告:賦值使指針從整數開始而沒有強制轉換[默認啟用]

[英]C: Warning: assignment makes pointer from integer without a cast [enabled by default]

對於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嗎? 還是我對此的理解是完全錯誤的?

嘗試這個

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;

您正在嘗試將=右側(rhs)的int分配給左側(lhs)類型為int*內容。 lhs是一個變量,它包含一個指向可以存儲int的存儲位置的指針。 因此,為了寫入該位置,您首先必須使用*priorities[currIdx]取消引用指針變量。 這告訴編譯器:“不要寫變量本身,而要查找它指向的位置並在那里寫。”

這與您首先說priorities[currIdx]時的操作類似。 可變prioritiesint** 那是一個指向int的指針。 您不想覆蓋變量本身,而是想要使用新的指針寫其指向的位置(類型為int* )。 在那種情況下,您取消引用說priorities[currIdx] ,它等效於*(priorities + currIdx)


但是,為數組的每個插槽分配額外的int不僅不必要而且麻煩,而且還會使您的代碼慢得多。 通過簡單地傳遞int* priorities ,您可以直接擁有一個int數組。 然后,您可以像原來在問題中一樣將所有malloc行放在一起並寫入數組。 也就是說,無需取消引用:

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

因為priorities[currIdx]將具有int類型。

priorities [currIdx]是整數指針類型。 您不能將int分配給address。

做這個:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM