es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comportamiento inesperado en la asignación a un arreglo de arreglos de longitud dos a través de un bucle for.

Me encontré con el siguiente comportamiento inesperado mientras programaba y no entiendo por qué ocurre esto ni cuál es la diferencia entre los dos casos siguientes.

Considera los siguientes dos fragmentos de código:

#include <stdint.h>
#include <stdio.h>
typedef uint64_t* bitset;

int main(int argc, char ** argv) {
    bitset list[2];
    list[0] = (uint64_t[2]) {(uint64_t) 0LL, (uint64_t) 0LL};
    list[1] = (uint64_t[2]) {(uint64_t) 0LL, (uint64_t) 0LL};
    printf("%p\n", &list[0][0]);
    printf("%p\n", &list[1][0]);
    return 0;
}

y

#include <stdint.h>
#include <stdio.h>
typedef uint64_t* bitset;

int main(int argc, char ** argv) {
    bitset list[2];
    for(int i = 0; i < 2 ; i++) {
        list[i] = (uint64_t[2]) {(uint64_t) 0LL, (uint64_t) 0LL};
    }
    printf("%p\n", &list[0][0]);
    printf("%p\n", &list[1][0]);
    return 0;
}

En el primer ejemplo, ambos valores apuntan a una ubicación diferente en la memoria, como se esperaba, pero al inicializar list[0] y list[1] a través de un bucle for, tanto list[0][0] como list[1][0] apuntan a la misma ubicación en memoria.

¿Qué está causando esto? ¿Por qué hay una diferencia en la ejecución entre ambos métodos? Estoy compilando en una máquina Ubuntu y esto ocurre con gcc y clan.</stdio.h></stdint.h></stdio.h></stdint.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    La diferencia en la ejecución entre los dos métodos se debe a la diferencia en cómo se inicializan los elementos del array. En el primer ejemplo, los elementos del array se inicializan utilizando un literal compuesto, que crea un array temporal que luego se asigna a los elementos del array. Esto significa que cada elemento del array tiene su propia ubicación de memoria única.

    En el segundo ejemplo, los elementos del array se inicializan utilizando un bucle for, que asigna la dirección del array temporal a cada elemento del array. Esto significa que ambos elementos del array apuntan a la misma ubicación de memoria, que es el primer elemento del array temporal.

    Para solucionar el problema en el segundo ejemplo, puedes asignar memoria para los elementos del array utilizando malloc y asignar valores a la memoria asignada. Alternativamente, puedes usar el primer método de inicialización de los elementos del array utilizando un literal compuesto.

Comments are closed.