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.