字符数组和 uintptr_t

Posted

技术标签:

【中文标题】字符数组和 uintptr_t【英文标题】:Char Array and uintptr_t 【发布时间】:2019-03-22 18:13:49 【问题描述】:

我正在阅读What is uintptr_t data type,但我仍然无法理解这里的uintptr_t

首先将 char 数组 类型临时转换为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的主要内容,如果未能解决你的问题,请参考以下文章

c语言字符串数组和字符数组有啥区别?

字符串和字符数组

C语言的字符数组和字符串的区别

字符串数组与字符指针的区别

在c语言中怎么把字符数组转换为字符串

07.字符数组和字符串