【问题标题】:How can I free uint32_t pointer?如何释放 uint32_t 指针?
【发布时间】:2019-02-22 09:02:33
【问题描述】:

我是 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

【问题讨论】:

  • free((void *)data); ?顺便说一句,您的程序将无法在 64bit 机器上运行。有关更多信息,请查看 64 位机器上指针的大小。
  • 除了您的指针类型问题之外,您还有未定义的行为,因为您没有为终止字符串的\0 字节分配内存。
  • 你为什么要写这么晦涩的代码呢?您要解决的实际问题是什么?
  • void test(uintptr_t *data) { return (uintptr_t)strdup("this is a test data"); } 更短更清晰

标签: c windows visual-studio compilation


【解决方案1】:

您的程序将无法在 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;
}

【讨论】:

  • 只有uintptr_tintptr_t 保证支持从指针到整数到指针的往返转换而不会丢失保真度。特别是,size_t 不保证具有此属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多