Void * в качестве возвращаемого типа дает значение int и предупреждение: C

Я реализую свой собственный malloc и столкнулся с небольшой проблемой с пустотой *

Когда я печатаю возвращаемые адреса в mem_alloc:

    printf("Addr p = %p\n", (void *)(p+ 1));

это дает мне что-то вроде этого:

    Addr p = 0x7f20f20b1050

Но когда я печатаю тот же возвращаемый указатель в mymain.c:

    p1 = (int *)Mem_Alloc(40879);
    printf("%p\n", p1);

Я получаю: 0xffffffffff20b1050 Это приводит к ошибке seg в моем mem_free

Я возвращаюсь :

    return (void *)(p + 1);

Я также получил предупреждение для mymain.c: mymain.c:10: предупреждение: привести к указателю из целого числа разного размера

Я не понимаю, почему он становится целочисленным типом, когда я возвращаю void*

    for (p = freep; p != NULL; prevp = p, p = p->ptr) {
            if (p->size == size) {
                    if (prevp == NULL) {
                            freep = p->ptr;
                    } else {
                            prevp->ptr = p->ptr;
                    }
            } else if (p->size > size) {
                    p->size = p->size - size;
                    p = (Header *)((char *)p + p->size);
                    p->size = size;
            } else {
                    continue;
            }
            printf("Addr p = %p\n", (void *)(p+ 1));
            return (void *)(p+1);
    }

person user1166419    schedule 03.03.2014    source источник
comment
Можете ли вы опубликовать функцию распределения или хотя бы ее соответствующую часть?   -  person Omer    schedule 03.03.2014


Ответы (1)


Проверьте тип возврата вашего Mem_Alloc:

int Mem_Alloc(int size);

Все, что вы вернете в приведенной выше функции, будет приведено к типу int.

Редактировать:

Следующий код:

/* main.c */
#include <stdio.h>

int main() {
    int *p1;
    p1 = (int *)Mem_Alloc(40879);
    printf("%p\n", p1);
}

/* mem_malloc.c */
void* Mem_Alloc(int size) {
    return (void*)0x7f20f20b1050;
}

Показывает FFFFFFFFF20B1050 в моей Windows 8.1/Visual Studio 2013 (x64), потому что, если Mem_Alloc не объявлен до его вызова, его возвращаемый тип будет неявно быть int. Добавление строки void* Mem_Alloc(int size); перед int main() { может решить проблему.

person jingyu9575    schedule 03.03.2014
comment
Тип возвращаемого значения: void* void *Mem_Alloc(int size) { - person user1166419; 03.03.2014
comment
@user1166419 user1166419 Какая 10-я строка mymain.c? - person jingyu9575; 03.03.2014
comment
9: интервал *p1; 10: p1 = (целое *)Mem_Alloc(40879); @jingyu9575 - person user1166419; 03.03.2014
comment
@user1166419 user1166419 Вы объявили Mem_Alloc перед вызовом? Я имею в виду, была ли у вас строка: void* Mem_Alloc(int size); до 10 строки? - person jingyu9575; 03.03.2014