我试图将一个结构地址转换为字符串,但我已经尝试了两种方法来写代码.第一种方法导致了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中不是)。
sizeof(unit)
是二进制表示的字节数。unit
. 在某些环境中,它将小于字符串表示的字节数。例如,如果指针长度为4字节,而它们用8位十六进制字符串表示。 sizeof(unit)
(=4)小于代表字符串的长度(=8),将发生越界写入。
要动态分配内存。
实施例(应添加错误检查和 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);