¿Asignar una matriz crea un puntero o copia una matriz? (Solidez)

Aquí está el código:

pragma solidity^0.4.16;

contract Test {

    struct SomeData {
        address[] users;
    }

    address[] nullArray;
    mapping(uint => SomeData) SomeDataList;

    function insertData(uint number) {
        SomeDataList[number] = SomeData({
            users : nullArray
        });

        SomeDataList[number].users.push(msg.sender);
    }

}

En insertDatala función, inicializo una nueva estructura y la asigno nullArrayal userscampo ( ¿ usersahora almaceno una copia nullArrayo un puntero a él?). Después de eso, envío algunos datos a esta estructura y no estoy seguro de si la variable global nullArrayse verá afectada o no.

@AchalaDissanayake Lo siento, solo hice mal clic debido al retraso del navegador)) la respuesta es excelente

Respuestas (2)

¿Los usuarios ahora almacenan una copia de nullArray o un puntero a él?

Creará una copia independiente. Según tengo entendido, dado que ambos nullArrayy SomeDataListson variables de estado, habrá dos copias independientes.

Se menciona en los documentos de solidez aquí que,

las asignaciones entre almacenamiento y memoria y también a una variable de estado ( incluso de otras variables de estado ) siempre crean una copia independiente.

por eso,

Empujé algunos datos a esta estructura y no estoy seguro de si la variable global nullArray se verá afectada o no.

nullArrayno se verá afectado.

ACTUALIZAR

Probé su código con algunas funciones adicionales en Remix-IDE de la siguiente manera,

pragma solidity^0.4.16;

contract Test {

    struct SomeData {
        address[] users;
    }

    address[] nullArray;
    mapping(uint => SomeData) SomeDataList;

    function insertData(uint number) {
        SomeDataList[number] = SomeData({
            users : nullArray
        });

        SomeDataList[number].users.push(msg.sender);
    }


    function getusers(uint number) constant returns(address []){
        return SomeDataList[number].users;
    }

    function getNullArray() constant returns(address[]){
        return nullArray;
    }

    function pushNullArray(address addr){
        nullArray.push(addr);
    }

}

Y nullArrayy SomeDataListactuaron como dos variables diferentes. Estos son los resultados de la llamada a la función después de la llamada pushNullArray(address addr)y insertData(uint number)con algunos valores arbitrarios.

ingrese la descripción de la imagen aquí

No eran lo mismo.

¡Espero que esto ayude!

Crea una copia. Aunque nullArray& usershere son tipos de referencia de almacenamiento, la asignación a variables de estado siempre hace una copia.

https://docs.soliditylang.org/en/v0.8.13/types.html#ubicación-de-datos-y-comportamiento-de-asignación