Вопрос

Исходя из 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 * означает, что это указатель для размещения в памяти, который мы не указали, как индексировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top