С:Функция возвращается через void *
-
10-07-2019 - |
Вопрос
Исходя из Java, меня смущает использование Void, позволяющее возвращать значение следующим образом:
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");
exit( EXIT_FAILURE );
}
return result;
}
Возвращает ли это указатель на выделенную часть памяти?
Решение
Да, это так. Указатель void * - это, в основном, общий указатель на адрес памяти, который обычно может быть приведен по типу к тому типу, который был фактически желаемым.
Другие советы
Ваш вопрос указывает на то, что вы неправильно понимаете тип возвращаемого значения функции.Существует большая разница между:
void foo( void ) {}
и
void *bar( void ) {}
foo() не принимает аргументов и не возвращает значения, а bar() не принимает аргументов и возвращает общий указатель.В C ключевое слово void используется для обозначения универсального указателя, а объект типа void * может быть преобразован в указатель любого другого типа без потери информации.
Да, эта функция возвращает указатель на выделенную память определенного размера. Он отличается от malloc в том смысле, что он гарантированно возвращает указатель. В случае неудачи он выйдет из приложения. Р>
Да. void*
означает указатель на что-то, но не определенного типа.
void означает по существу отсутствие типа, поэтому, если у нас есть void * p; р - указатель на что-то, но мы еще не сказали что. Р>
void без указателя - ничто, следовательно, void foo (void) - функция, которая не принимает аргументов и ничего не возвращает.
И да, malloc возвращает указатель на какой-то кусок памяти, malloc не знает или не заботится, какой тип имеет эта память, поэтому его тип возврата void *
В Java нет арифметики указателей. Это то, о чем вы спрашиваете. Например, представьте, что malloc
возвращает указатель типа int
int* malloc(size_t size)
{
//
}
Возможно, вы получите указатель, который в основном является указателем на массив
. Тогда вы будете индексировать его как обычные массивы.
int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).
Проблема в том, что C
не перегружает функции. Итак, мы должны найти способ написать универсальный malloc
. В противном случае вы получите разные malloc
для каждого типа. Решение состоит в том, чтобы отправить необходимое количество байтов, которое вам нужно. Затем вы можете индексировать его так, как вам нравится. Это дает большую гибкость и решение для всех.
int* i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte
int thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)
Итак, вся идея в том, что не имеет значения, как мы индексируем память, которую мы получили от malloc
. Все, что нам нужно сделать, это указать тип вновь созданного массива, чтобы правильно его проиндексировать. void *
означает, что это указатель для размещения в памяти, который мы не указали, как индексировать.