realloc zeroes parts of previously allocated memory [closed]

As I know, realloc is supposed to make a bigger/smaller allocation and copy the data given to it here. I was making a sprisheet atlas parser and encountered this, then reproduced it with very simple code.

uint32_t* a = malloc(10 * sizeof(uint32_t));
for (uint32_t i = 0; i < 10; i++) a[i] = i;
for (uint32_t i = 0; i < 10; i++) printf("%dn", a[i]);

printf("nn");

a = realloc(a, 10);
for (uint32_t i = 0; i < 10; i++) printf("%dn", a[i]);

free(a);

The first for loop outputs 0 1 2 3 4 5 6 7 8 9 as expected, but the second one prints this 0 1 2 3 0 0 0 0 0 0. Why has realloc zeroed out the memory for the last 6 elements? What am I doing wrong?

2

The second parameter of realloc is the number of bytes requested, not the number of elements. a = realloc(a, 10); changes the allocation to 10 bytes, which is not what you want.

To change the allocation to n elements, use a = realloc(a, n * sizeof *a);. Or, for safety, use:

void *t = realloc(a, n * sizeof *a);
if (!t)
{
    // Handle reallocation failure.
}
a = t;

The memory outside those first ten bytes has been freed (if realloc reused the old allocation) or has not been allocated (if realloc created a new allocation), and its contents are not defined by the C standard.

It doesn’t necessarily be 0 1 2 3 0 0 0 0 0 0. Following is the snippet from man page of realloc.

The realloc() function shall deallocate the old object pointed to
by ptr and return a pointer to a new object that has the size
specified by size. The contents of the new object shall be the
same as that of the old object prior to deallocation, up to the
lesser of the new and old sizes. Any bytes in the new object
beyond the size of the old object have indeterminate values.

So, in your case only the first 10 bytes of previously allocated 10 * sizeof(uint32_t) bytes are copied at the reallocation. Hence, while you were using second loop to print the values you were actually moving beyond 10 bytes that you are actually given or may be allowed to access using pointer a. As a is the pointer to uint32_t, in each iteration, you were trying to access the items sizeof(uint32_t) bytes further. There could be anything. Just for practical try :

for (uint32_t i = 0; i < 10; i++) 
    printf("%d and %pn", *(a + i),(void*)(a+i));

You will see address is moving 4 bytes further and accessing whatever is placed there. For me output was :

0 and 0x61342d2802a0
1 and 0x61342d2802a4
2 and 0x61342d2802a8
3 and 0x61342d2802ac
4 and 0x61342d2802b0
5 and 0x61342d2802b4
6 and 0x61342d2802b8
7 and 0x61342d2802bc
8 and 0x61342d2802c0
9 and 0x61342d2802c4

I just wanted to add a minor point. Besides, @Eric has already provided sufficient answer on how reallocation is done and handled.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật