C语言中为什么经常需要参数用来指明字符指针长度?

发布于 2022-09-05 14:51:48 字数 403 浏览 19 评论 0

如下面的例子:

int zend_hash_add(
    HashTable *ht,       
    char *arKey,            
    uint nKeyLen,       
    void **pData,        
    uint nDataSize,
    void *pDest            
);

zend_hash_add(fooHashTbl, "bar", sizeof("bar"), &barZval, sizeof(zval*), NULL);

为什么需要nKeyLen参数?因为感觉每次传的参数都是sizeof(arKey),为什么不在函数内部处理呢?是不是有什么需要特殊处理的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

他不在意 2022-09-12 14:51:48

对于字符数组,sizeof给出来的是数组长度,对于字符指针,sizeof给出来的是指针的宽度。
如果你在这个函数内部处理,你得到的就只是指针变量的大小,不可能得到字符串长度。
字符串长度使用strlen。
如果你能确保字符串永远正确地以\0结尾,可以使用strlen而不再传递长度。

char *str="hello"; // sizeof(str) == 8, 在64位系统上;32位系统是4
char str[]="hello"; // sizeof(str) == 6
char str[10]="hello"; // sizeof(str) == 10
挽清梦 2022-09-12 14:51:48

因为c语言中,数组作为参数的时候,就是一个指针。
因此,在函数内,是不能通过sizeof得到这个指针所指字符串的长度的。得到的只是指针变量的长度。

甜宝宝 2022-09-12 14:51:48

sizeof一个字符串常量,比如"abcdef"。得到的是字符串实际的长度(包含结束符),这里是7。
如果传递进入函数,就会退化为一个普通的char *指针。这时sizeof就是指针的大小了,这里是4或8。但是strlen还是能得到长度的。
问题在于你得确保这个key是一个C字符串(0结束),才不需要长度。而真正的哈希值是二进制串,中间可能有\0。所以传递进入函数必须带长度,strlen无法得到正确长度。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文