Viene visualizzato il seguente avviso: incompatible pointer types 'void**' and 'int* [2]'
.vuoto ** puntatore e vuoto * [] come parametri di funzione
Quando provo a compilare il codice seguente:
#include <stdlib.h>
void func1(void *arr[]) { }
int main() {
int *arr[2];
for (int i = 0; i < 5; i++) {
arr[i] = (int*)malloc(sizeof(int));
*(arr[i]) = 5;
}
func1(arr);
}
Ora, funziona quando ho gettato arr con (void**)
, e non riuscivo a trovare una ragione per questo. Inoltre ho scoperto che ho anche bisogno di lanciare nel codice seguente:
#include <stdlib.h>
void func1(void **arr) { }
int main() {
int **arr;
int i[] = { 1, 2 };
int j[] = { 3, 4 };
*arr = i;
*(arr+1) = j;
func1(arr); //Doesn't compile unless I use (void*) or (void**) casting
}
so che se il parametro di una funzione è un puntatore a void
possiamo passare ad essa tutto ciò puntatore che vogliamo senza fusione, perché tutti i puntatori sono della stessa dimensione allora perché non posso passare un puntatore a un puntatore allo stesso modo?
Forse cercavi 'int * arr [5];'? –
Perché il puntatore a un puntatore non è un puntatore a 'void'. Solo un puntatore a 'void' è garantito per essere compatibile con altri puntatori. –
Se i puntatori erano array, non sarebbero chiamati "puntatori". – Olaf