【问题标题】:How to dereference a void pointer as a string如何取消引用 void 指针作为字符串
【发布时间】:2020-07-04 18:46:21
【问题描述】:

我目前正在尝试将字符串复制到 void 指针。 这是我正在使用的 void 指针结构。

typedef struct
  {
  struct runtime_type *runtimeTypeHead; /* Array of Runtime Types       */
  ST_INT numRuntimeTypes;               /* # of Runtime Types in array  */
  ST_CHAR *dataBuf;                     /* ptr to local data            */
  ST_VOID *userInfo;                    /* To store anything user wants.*/
                                        /* GSE code does not use it.    */
  } GSE_IEC_DATA_ENTRY;

如你所见,我正在使用 userInfo。

我已经分配了内存并使用了 memcpy,如下面的代码所示。

DataEntry->userInfo = safe_malloc(sizeof(ST_CHAR)*strlen(ps8tmp+1));
memcpy((ST_CHAR*)DataEntry->userInfo, ps8tmp,strlen(ps8tmp));

我想我在将字符串复制到 void 指针时没有遇到内存问题。 然后,当我尝试如下打印复制的字符串时出现段错误。

printf("Updated DataEntry : %s\n", *(ST_CHAR*) DataEntry->userInfo);

谁能指出为什么我在打印字符串时会出现段错误?

【问题讨论】:

  • 您正在取消引用 printf 中的 %s 需要指向字符串的指针的字符串。 printf("更新的 DataEntry : %s\n", (ST_CHAR*) DataEntry->userInfo);从你的演员表中删除 *,如下所示。
  • 是的。你是对的。谢谢@CodeWhore!!

标签: c string segmentation-fault out-of-memory void-pointers


【解决方案1】:

这个:

DataEntry->userInfo = safe_malloc(sizeof(ST_CHAR)*strlen(ps8tmp+1));

有两个问题:

  1. 为字符串分配空间时不要使用sizeof(char);它始终为 1,除非您使用明确的 16 位字符或其他东西进行了一些奇特的事情。
  2. strlen() 的用法似乎被破坏了,您在括号内添加 ,它将在字符串上调用strlen(),减去第一个字符。如果字符串为空,这将给出未定义的行为。你的意思是strlen(ps8tmp) + 1

【讨论】:

  • 感谢您的意见@unwind。正如你所指出的,我已经修改了部分,但段错误仍然存​​在:(
  • 其实,我刚刚用上面 CodeWhore 的评论解决了这个问题。谢谢你回答我的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多