matrices - Int* generando longitud incorrecta c++

CorePress2024-01-25  10

Este problema me ha preocupado mucho. Puede parecer ridículo, pero esto es exactamente lo que pasó en mi terminal.

int* nums = new int[100];
cout << sizeof(nums);

pero el bloque de arriba genera 8 en lugar de 100; ¿Alguien puede ayudarme?

Programa completo (readfile.cpp):

// imports

pair<int, int*> Readfile::readfile (string dirc) {
    string fn;
    if (dirc.compare("") == 0) {
        cout << ">>> Input file name: "; cin >> fn; cout << endl;
    }
    else
        fn = dirc;

    ifstream infile(fn);
    string line;
    vector<int> ints;

    while (getline(infile, line)) {
        istringstream iss(line);
        for (string k; iss >> k; )
            ints.push_back(stoi(k));
    }

    int* nums = new int[100];
    cout << sizeof(nums);
    copy(ints.begin(), ints.end(), nums);
    int n = sizeof(nums)/sizeof(nums[0]);
    
    pair<int, int*> pii(n, nums);
    return pii;
}

int main() {
    Readfile rdf;
    rdf.readfile("..\insertion\temp.txt"); // a text file consisting of 100 random integers separated by spaces
    return 0;
}

Cualquier ayuda es muy apreciada.

2

¿Esto responde a tu pregunta? ¿Cómo encontrar el 'tamaño de' (¿un puntero que apunta a una matriz)?

- 273K

28 de marzo de 2021 at 3:27

Me gustaría mucho recibir una respuesta excepto "no", para ser sincero; He copiado valores de un vector int a una matriz int antes, pero de alguna manera esta vez no funcionará

- crimsonpython24

28 de marzo de 2021 a las 3:31

1

@crimsonpython24: un puntero no sabe nada excepto que apunta a una sola entidad. No tiene idea de que aquello a lo que apunta tiene varios elementos detrás. El problema es queLe hicieron creer que hay cierta información que el puntero conoce, además del único elemento al que apunta.

- Paul McKenzie

28 de marzo de 2021 a las 5:12

duplicado: ¿Cómo saber cuál es el tamaño de una matriz asignada dinámicamente (usando sizeof())? ¿Qué debo hacer para obtener el tamaño de una matriz "dinámica"? matriz?

-phuclv

28 de marzo de 2021 a las 5:37



------------------------------------

¡¡¡Te estás confundiendo aquí!!! El tamaño del tipo de puntero int*, char* o double * es de 8 bytes o 64 bits. Eso es lo que te ofrece sizeof().

Si desea aumentar el tamaño del lugar al que apunta la memoria, debe reasignar la memoria. Para hacerlo, puedes crear tu propia función resize():

void resizeIntArray (int**, int, int);

int main (void) {
   int sizeOfA = 55;
   int* a = new int(sizeOfA); // 55 slots for integers have been allocated
   std::cout << sizeof(a); // gives you 8 because it not size of allocated memory
                           // rather it is size of type.
   int newSizeOfA = 100;
   resize(a, sizeOfA, newSizeOfA);

   std::cout << sizeof(a); // AGAIN!!!! gives you 8 because it not size of allocated memory
                           // rather it is size of type.

   return 0;
}

void resize (int **a, int oldSize, int newSize) {
   int* temp = new int[newSize];

   for (int i = 0; i < oldSize; ++i)
      temp[i] = a[i];

   delete[] a; // destroys old A
   a = temp;
}

Entonces, en mi ejemplo, el nuevo espacio asignado es 100 en lugar de 55.

Piense en sugerencias como la dirección de su casa. Y si tienes 1000 pies cuadrados, para tener más espacio debes quitar todo de tu antigua casa y construir una nueva casa (digamos de 5000 pies cuadrados).

6

¿Puedes dar más detalles? ¿Cómo uso el tamaño de la matriz en lugar del tamaño del puntero?

- crimsonpython24

28 de marzo de 2021 a las 3:21

Cuando usas new básicamente estabas diciendo "asigna espacio en el montón para 100 enteros y dame la dirección de memoria para el primero". Como estás en una máquina de 64 bits, tus direcciones de memoria son de 64 bits (es decir, 8 bytes) de largo.gramo. Entonces, cuando haces sizeof(nums), básicamente estás pidiendo a la máquina que devuelva el tamaño de una de sus direcciones de memoria. El tamaño de un puntero es producto del sistema operativo.

-iandinwoodie

28 de marzo de 2021 a las 3:25

Encontré un foro que decía usar algo como int n = sizeof(nums)/sizeof(nums[0]); pero todavía no dará el resultado correcto. El tamaño de los enteros es 100, pero n solo produce 2. A menos que haya algún problema con la función de copia, no sé dónde está el problema

- crimsonpython24

28 de marzo de 2021 a las 3:29

1

El tamaño de los números es 8. No 100 (probablemente estés pensando en 400 sobre cómo quieres que se comporte). Ese 'truco' solo funciona si está en el mismo alcance de una matriz real y no de un puntero. Sólo tienes que haber almacenado el tamaño en otro lugar para referenciarlo.

- dulce

28 de marzo de 2021 a las 3:30

@crimsonpython24 si te preguntas "bueno, entonces, ¿cómo sé el tamaño"? La respuesta es que necesita almacenar el número que pasó a nuevo y realizar un seguimiento manual del número de números enteros para los que ha asignado espacio. Uno de los beneficios de los contenedores proporcionados por STL (por ejemplo, std::vector) es que se encargan de administrar ese tamaño por usted.

-iandinwoodie

28 de marzo de 2021 a las 3:32

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare