我無法理解為什么編譯器在通過 (?:) 分配不兼容的指標時不會發出警告,但會在直接分配時發出警告。
在這種情況下編譯器會發出警告:
test.c:在函式'main'中:test.c:8:4:警告:從不兼容的指標型別'uint32_t **'分配給'uint32_t *'{aka'unsigned int *'} {aka'unsigned int ** '} [-Wincompatible-pointer-types] 8 | 一個=陣列;| ^
#include <stdint.h>
#include <stdlib.h>
int main(void)
{
uint32_t *array[10], *a;
a = array;
}
在以下情況下沒有警告:
#include <stdint.h>
#include <stdlib.h>
int main(void)
{
int b = 8;
uint32_t *array[10], *a;
a = (b >= 8) ? array : malloc(8);
}
環境:
Gcc version 9.3.0
Ubuntu 20.04
compilation cmd: gcc test.c -o test.out
uj5u.com熱心網友回復:
運算式的型別(b >= 8) ? array : malloc(8)是void*(因為malloc(8)有型別void*)。你可以通過做一些無意義的事情并讓編譯器告訴你來看到這一點:
((b >= 8) ? array : malloc(8)) * 5;
<source>:10:36: error: invalid operands to binary * (have 'void *' and 'int')
10 | ((b >= 8) ? array : malloc(8)) * 5;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
| |
| void *
void*可以隱式轉換為任何型別的指標,這就是為什么當您將該值分配給a.
uj5u.com熱心網友回復:
來自 C 標準(6.5.15 條件運算子)
- ...否則,一個運算元是指向 void 或限定版本的 void 的指標,在這種情況下,結果型別是指向適當限定版本的 void 的指標。
該函式malloc回傳一個型別為 的指標void *。所以帶有條件運算子的運算式的型別是void *. 并且該型別的指標void *可以分配給任何其他物件型別的指標。
來自 C 標準(6.3.2.3 指標)
1 指向 void 的指標可以轉換為指向任何物件型別的指標或從指向任何物件型別的指標轉??換。指向任何物件型別的指標都可以轉換為指向 void 的指標并再次回傳;結果應與原始指標比較。
事實上你有
a = ( void * )(b >= 8 ? array : malloc(8) );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416399.html
標籤:
上一篇:base58解碼和存盤大數字?
下一篇:C中鏈表內的動態陣列
