Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why I'm lossing data using realloc()?

I’m still a beginner, so I don’t know much and I’m sorry if it looks too dumb. I was learning about memory leak and how to use malloc(), calloc(), free() and realloc().

I tried this sample above on visual studio, however when I saw the results after using realloc, I didn’t got the same values that was before on that struct.

#include <iostream>
#include <string>


struct sNum
{
    int b = 0;
};

int main()
{
    int n = 10;
    struct sNum* a;
    a =(struct sNum*) malloc(n * sizeof(struct sNum));
    for (int i = 0; i < n; i++)
    {
        a[i].b = i;
        std::cout << std::to_string(a[i].b) + " ";
    }
    std::cout << "\n";
    n++;
    a = (struct sNum*)realloc(a, n);
    a[n - 1].b = n - 1;
    for (int i = 0; i < n; i++)
    {
        std::cout << std::to_string(a[i].b) + " ";
    }   
    return 0;
}

Running that code on visual studio, it results:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

0 1 2 3 4 5 6 7 8 9
0 1 -50331646 -570556931 -572662307 -572662307 -757975909 -2147479587 -572662307 -572662307 10

I was expecting the same sequence, plus 10 at the end. Anyone knows what I’m doing wrong?
Thx in advance!

>Solution :

Assuming that sizeof(sNum) is 4 on your platform, the line

a =(struct sNum*) malloc(n * sizeof(struct sNum));

will allocate 40 bytes of memory.

The line

a = (struct sNum*)realloc(a, n);

will shrink the allocated memory to 11 bytes, which is only sufficient to store 2 elements.

Due to this, the line

a[n - 1].b = n - 1;

will invoke undefined behavior, because valid indexes into a are only 0 and 1 (because there is only room for 2 elements), however you are using the index 10.

Therefore, to fix this, you should change the line

a = (struct sNum*)realloc(a, n);

to:

a = (struct sNum*)realloc( a, n * sizeof(sNum) );
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading