Doble puntero c

struct counter{ long long counter; } struct instruction{ struct counter *counter int repetitions; void (*work_fn)(long long *); }; int ncounter; //number of counters struct counter *counter; //counter array int nthreads; //number of threads int *ninstructions; //number of instructions struct instruction **instructions; 

¿Cómo funciona esto realmente? Estoy teniendo problemas con ** punteros

A ** es solo un puntero a un puntero. Entonces, cuando una instruction* contiene la dirección de una estructura de instruction , una instruction** contiene la dirección de una instruction* que contiene la dirección de un objeto de instruction .

Para acceder a la instruction apuntada por el puntero apuntado por una instruction** , simplemente use dos asteriscos en lugar de uno, como (**p).repetitions o algo similar.

Puedes visualizarlo así:

 instruction* ----> instruction instruction** ----> instruction* ----> instruction 

Sin embargo, recuerde que simplemente debe declarar struct instruction** instructions; en realidad no crea una estructura de instruction . Simplemente crea un puntero que contiene un valor de basura. Tendrás que inicializarlo:

 struct instruction inst; // set members of inst... *instructions = &inst; ... (*instructions)->repetitions++; // or whatever 

Sin embargo, parece que estás usando una instruction** para apuntar a una serie de instruction* s. Para inicializar la matriz, necesita un bucle for :

 instructions = malloc(sizeof(struct instruction*) * num_of_arrays); for (i = 0; i < num_of_arrays; ++i) instructions[i] = malloc(sizeof(struct instruction) * size_of_each_subarray); 

Y luego puede acceder a un elemento como instructions[i]->datamember .

struct instruction **instructions; // How does this actually works ? I am having trouble with ** pointers

No estoy seguro de cuál es el verdadero problema, pero intentaré responder la pregunta.

Doble puntero es un puntero a puntero. Puede ser demandado como matriz de punteros, por ejemplo (si asigna memoria en consecuencia). Por ejemplo:

 instructions = malloc(5*sizeof(struct instruction*)); for (int i = 0; i < 5; i++) instructions[i] = malloc(sizeof(struct instruction)); 

Y tienes una buena variedad de 5 punteros para struct instruction . Úsalo así:

 instructions[0]->repetitions = 0; 

instructions es un puntero a un puntero a la struct instruction .

Esto significa que *instructions le darán un puntero a una struct instruction . Este tipo de construcción se utiliza a menudo para crear una matriz dinámica de punteros a algún tipo compuesto.