Прежде всего, не пишите код вроде
vett = realloc(vett, size * sizeof(uint32_t));
в случае сбоя realloc()
вы также потеряете исходный указатель.
Из C11
, глава §7.22.3.5
Если память для нового объекта не может быть
после выделения старый объект не освобождается, а его значение не изменяется.
и
Функция realloc
возвращает указатель на новый объект (который может иметь тот же
значение как указатель на старый объект), или нулевой указатель, если новый объект не может быть
выделяется.
Всегда перехватывайте возвращаемое значение realloc()
во временном указателе, сверяйте его с NULL
и, если оно допустимо, вы можете (необязательно) присвоить его исходному указателю. Нечто подобное (псевдокод)
pointer temp = NULL;
temp = realloc (oldPOinter, size);
if (!temp)
{
printf ("Some error message");
return SOME_ERROR_CODE;
}
oldPOinter = temp;
Тем не менее, проблема здесь в том, что в случае успеха realloc()
исходный указатель больше не будет использоваться. v
передается somme_2a2()
в качестве аргумента, а в соответствии с C - передачей по значению. Таким образом, любое изменение, внесенное в vett
, не будет отражено для вызывающего абонента в v
.
Однако, поскольку realloc()
меняет действительность указателя памяти на vett
, после успешного возврата из вызова somme_2a2()
в main()
, v
больше не действует, и вы не не нужно передавать это free()
.
Цитата C11
, глава §7.22.3.5
Функция realloc
освобождает старый объект, на который указывает ptr
, и возвращает
указатель на новый объект, размер которого указан size
. [...]
Передача vett
в free()
приведет к неопределенному поведению, потому что вы в конечном итоге попытаетесь free()
указатель, который уже был free()
-d [через успех realloc()
].
Цитировать главу §7.22.3.3
[...] если
аргумент не совпадает с указателем, ранее возвращенным управлением памятью
функции, или если пространство было освобождено путем вызова free
или realloc
,
поведение не определено.