字符数组和 uintptr_t
Posted
技术标签:
【中文标题】字符数组和 uintptr_t【英文标题】:Char Array and uintptr_t 【发布时间】:2019-03-22 18:13:49 【问题描述】:我正在阅读What is uintptr_t data type,但我仍然无法理解这里的uintptr_t
unsigned long int
类型,然后再转换回char*
类型来达到什么目的。
考虑下面的代码快照
strncpy(pCfgMgr->mGlobalCfg.grMap[index].userName,
(char *)(uintptr_t) grParams.peerUsrName, 16); /*index is 0 */
pCfgMgr->mGlobalCfg.grMap[index].userName
中的 userName
只不过是一个声明为的 char 数组
char userName[MAX_USERNAME_LENGTH]; /* MAX_USERNAME_LENGTH is 16 */
而grParams.peerUsrName
中的peerUsrName
也是一个char数组,声明为
char peerUsrName[16];
我没有得到的是 uintptr_t
在复制时会有所作为,它只不过是 unsigned long int
的别名。我很想知道开发人员在此处使用uintptr_t
时的想法 & 是否推荐?
虽然没有uintptr_t
以上strncpy()
语句产生相同的输出。
衷心感谢所有帮助。
【问题讨论】:
使用(uintptr_t)
会创建对uintptr_t
存在的依赖,这是一种可选类型。除非存在公共类型uintptr_t
,否则代码不会编译。这样做更有可能是不必要的而不是有用的。
【参考方案1】:
演员表是不必要的。
strncpy
的第二个参数的类型为 const char *
。 char *
类型的表达式在这里也有效。 grParams.peerUsrName
的类型为 char [16]
。在大多数情况下,数组会衰减为指向第一个元素的指针。因此,当您将其传递给strncpy
时,它会衰减为输入char *
,这正是它所期望的。所以不需要演员表。
【讨论】:
谢谢。我同意腐烂的部分。我假设如果用户名长度只是16
或者可能几乎不 > 100,在我的情况下不会更多,为什么要转换为 uinitptr_t
。
开发人员有什么理由可以将其类型转换为uintptr_t
,以避免内存损坏?我不知道为什么这里需要uintptr_t
。
@Achal 也许写这段代码的人不知道指针衰减规则。
是的,可能是这样。以上是关于字符数组和 uintptr_t的主要内容,如果未能解决你的问题,请参考以下文章