我怎样才能释放uint32_t指针?

问题描述 投票:-2回答:1

我是指针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ạmAnhTuấ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

c windows visual-studio compilation
1个回答
0
投票

你的程序将无法在64bit机器上工作,因为64bit机器上的指针大小是8bytes

您可以使用uintptr_t而不是uint32_t来保存地址。虽然下面的示例代码显示,释放uintptr_tvoid*

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.