将结构体的地址转换为字符串

问题描述 投票:0回答:1

我试图将一个结构地址转换为字符串,但我已经尝试了两种方法来写代码.第一种方法导致了valgrind的错误,而第二种方法没有。而且它是我在重用valgrind时唯一的想法,但结果是不同的。如果你能告诉我问题出在哪里,我将非常感激。

第一个问题。

typedef struct Unit_t *Unit;

//Creating a unit

char* unit_address = malloc(sizeof(unit) + 1);
int convert_result = sprintf(unit_address,"%p",(void*)unit);

//Checking the return result and freeing the allocated memory

第二个:

typedef struct Unit_t *Unit;

//Creating a unit

char unit_address[30];
int convert_result = sprintf(unit_address,"%p",(void*)unit);

//Checking the return result

我想分配内存,因为我不知道指针的长度是多少(至少在我做的HW中不是)。

c struct heap valgrind
1个回答
0
投票

sizeof(unit) 是二进制表示的字节数。unit. 在某些环境中,它将小于字符串表示的字节数。例如,如果指针长度为4字节,而它们用8位十六进制字符串表示。 sizeof(unit) (=4)小于代表字符串的长度(=8),将发生越界写入。

要动态分配内存。

  1. 分配足够的缓冲区
  2. 将指针转换为字符串
  3. 测量结果字符串的长度
  4. 为字符串分配足够的内存

实施例(应添加错误检查和 snprintf() 应使用 sprintf() 以使其更安全)。)

char unit_address_buffer[512];
int convert_result = sprintf(unit_address_buffer,"%p",(void*)unit);
char* unit_address = malloc(strlen(unit_address_buffer) + 1);
strcpy(unit_address, unit_address_buffer);
© www.soinside.com 2019 - 2024. All rights reserved.