Malloc() не выделяет то, что я ожидаю

У меня есть два целочисленных указателя: a и b. Я использую следующую строку:

int* b = malloc(3 * sizeof(int));

Я ожидаю, что вызов sizeof(b) вернет 3 * sizeof(int), что равно 12, но это не так, и он возвращает 8.

Для a я хотел бы выделить элементы, присутствующие в b, с добавлением еще одного элемента (в конце). Если будет дан совет относительно того, как распределить несколько, мы будем признательны.

Мои вопросы вкратце таковы: Почему malloc демонстрирует поведение, описанное в первом абзаце и как по существу добавить к целочисленному массиву

b — указатель. sizeof(b) — размер указателя. В b нет элементов. b указывает на первый элемент. Элементы находятся в выделенной памяти, а не в указателе.
chux - Reinstate Monica 15.08.2024 06:41

и... malloc возвращает void*, а не int*. у вас могут возникнуть проблемы с компиляцией кода. см.: stackoverflow.com/questions/1281686/…

Bernhard Heinrich 15.08.2024 06:57

@BernhardHeinrich void* можно неявно преобразовать в int*, и на самом деле многие считают, что приведение возвращаемого значения malloc является антишаблоном.

Weijun Zhou 15.08.2024 07:02

@BernhardHeinrich см.: Должен ли я привести результат malloc (в C)?. Короткий ответ: нет.

wohlstad 15.08.2024 07:07

Педантично правильным способом размещения массива будет int (*b)[3] = malloc(3*sizeof(int));, и в этом случае вы действительно сможете использовать sizeof. Но этот синтаксис громоздкий, поскольку при доступе к элементам вам придется дважды учитывать указатель: (*b)[i] вместо b[i], поэтому мы стараемся избегать его, поскольку он делает код менее читабельным.

Lundin 15.08.2024 08:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

выделить элементы, присутствующие в 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 возможно?
Chris 15.08.2024 07:52

@Крис realloc уничтожает b. Из вопроса не ясно, нуждается ли ОП в работе b после этого.

Weijun Zhou 15.08.2024 07:59

sizeof — это оператор времени компиляции, который сообщает вам требования к объему памяти для выражения, заданного в качестве аргумента. В этом случае sizeof b совпадает с sizeof (int*) — на вашей платформе указатель на int, очевидно, имеет размер 8 символов.

malloc()не предоставляет никакого интерфейса для определения объема выделенной памяти, за исключением того, что он возвращает нулевой указатель, если не удалось выделить запрошенную сумму. Если вашей программе необходимо знать размер блока памяти, ответственность за сохранение этого значения в переменной лежит на программисте.

Другие вопросы по теме