【问题标题】:converting an address of a struct to string将结构的地址转换为字符串
【发布时间】:2020-08-25 15:10:21
【问题描述】:

我正在尝试将结构地址转换为字符串,但我尝试了两种编写代码的方法。 第一个导致了 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

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

【问题讨论】:

  • 什么是unit(不是Unit)?
  • 我创建了一个 Unit_t 结构体,变量 unit 作为指向这个结构体的指针。
  • 只为最长的字符串+1分配足够的空间。
  • 您没有考虑 %p 生成的字节数,它不是 sizeof(unit) 而是 %p 在您的系统上生成的字节数 + 1。只需打印出来而是使用 printf 查看长度。或者 unit_address = malloc(30);

标签: c struct heap-memory valgrind


【解决方案1】:

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);

【讨论】:

  • 感谢您的回答,但由于课程工作人员的指示,我无法假设指针的最大长度。是否有其他不使用缓冲区的方法?
  • 您可以使用snprintf()的返回值来检查缓冲区是否有足够的长度。如果返回值为非负且小于指定的缓冲区大小,则长度是可以的。如果缓冲区长度不够,请增加(例如双倍)缓冲区大小并重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多