Как я могу освободить указатель uint32_t? - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок с указателем в c.Я просто тестирую код, подобный этому

void test(uint32_t *data)
{
    unsigned char raw_data[] = "this is a test data";
    unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data));
    memcpy(raw, raw_data, strlen((char*)raw_data)+1);
    *data = (uint32_t)raw;
}

int _tmain(int argc, _TCHAR* argv[])
{
    uint32_t data;

    test(&data);
    printf("%s\n", data);
    if (data != NULL)
    {
        free(data);
    }
    return 0;
}

Я использую uint32_t для хранения unsigned char*, когда я пытаюсь освободить data, я встречаю ошибку error C2664: “void free(void *)”: uint32_t can not convert to “void *".

Как я могу освободить data?

Во-первых, благодаря Phạm Anh Tuấn, Gerhardh, KBlr и сыну.Вы очень добры.

Решение:

void test(uintptr_t *data)
{
    unsigned char raw_data[] = "this is a test data";
    unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data) + 1);
    memcpy(raw, raw_data, strlen((char*)raw_data));
    raw[strlen((char *)raw_data)] = '\0';
    *data = (uintptr_t)raw;
}

int _tmain(int argc, _TCHAR* argv[])
{
    uintptr_t data;

    test(&data);
    printf("%s\n", data);
    if (data != NULL)
    {
        free((void *)data);
    }
    getchar();
    return 0;
}

Необходимо добавить '\0' к raw в качестве завершающей строки, тогда free работает.А для работы на 64bit измените uint32_t на intptr_t.

1 Ответ

0 голосов
/ 18 сентября 2018

Ваша программа не будет работать на 64bit аппарате, поскольку размер указателя на 64bit аппарате равен 8bytes.

. Вы можете использовать uintptr_t вместо uint32_t для хранения адреса.Во время освобождения приведите uintptr_t к void*, как показано в примере кода ниже.

#include<stdint.h>
#include<stdlib.h>
#include<stdio.h>
void test(uintptr_t *data)
{
    unsigned char raw_data[] = "this is a test data";
    unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data));
    memcpy(raw, raw_data, strlen((char*)raw_data)+1);
    *data = (uintptr_t)raw;
}

int main(int argc, char* argv[])
{
    uintptr_t data;

    test(&data);
    printf("%s\n", (char *)data);
    if ((void *)data != NULL)
    {
        free((void *)data);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...