У меня есть два целочисленных указателя: a
и b
. Я использую следующую строку:
int* b = malloc(3 * sizeof(int));
Я ожидаю, что вызов sizeof(b)
вернет 3 * sizeof(int)
, что равно 12
, но это не так, и он возвращает 8
.
Для a
я хотел бы выделить элементы, присутствующие в b
, с добавлением еще одного элемента (в конце). Если будет дан совет относительно того, как распределить несколько, мы будем признательны.
Мои вопросы вкратце таковы:
Почему malloc
демонстрирует поведение, описанное в первом абзаце и
как по существу добавить к целочисленному массиву
и... malloc возвращает void*, а не int*. у вас могут возникнуть проблемы с компиляцией кода. см.: stackoverflow.com/questions/1281686/…
@BernhardHeinrich void*
можно неявно преобразовать в int*
, и на самом деле многие считают, что приведение возвращаемого значения malloc
является антишаблоном.
@BernhardHeinrich см.: Должен ли я привести результат malloc (в C)?. Короткий ответ: нет.
Педантично правильным способом размещения массива будет int (*b)[3] = malloc(3*sizeof(int));
, и в этом случае вы действительно сможете использовать sizeof. Но этот синтаксис громоздкий, поскольку при доступе к элементам вам придется дважды учитывать указатель: (*b)[i]
вместо b[i]
, поэтому мы стараемся избегать его, поскольку он делает код менее читабельным.
выделить элементы, присутствующие в b, с добавлением другого элемента
// Allocate
int *a = malloc(4 * sizeof(int));
// or better as
int *a = malloc(sizeof a[0] * 4);
// Copy the data pointed to by `b` to `a`.
memcpy(a, b, sizeof a[0] * 3);
// Assign.
a[3] = 42;
realloc
возможно?
@Крис realloc
уничтожает b
. Из вопроса не ясно, нуждается ли ОП в работе b
после этого.
sizeof
— это оператор времени компиляции, который сообщает вам требования к объему памяти для выражения, заданного в качестве аргумента. В этом случае sizeof b
совпадает с sizeof (int*)
— на вашей платформе указатель на int, очевидно, имеет размер 8 символов.
malloc()
не предоставляет никакого интерфейса для определения объема выделенной памяти, за исключением того, что он возвращает нулевой указатель, если не удалось выделить запрошенную сумму. Если вашей программе необходимо знать размер блока памяти, ответственность за сохранение этого значения в переменной лежит на программисте.
b
— указатель.sizeof(b)
— размер указателя. Вb
нет элементов.b
указывает на первый элемент. Элементы находятся в выделенной памяти, а не в указателе.