C语言中为什么经常需要参数用来指明字符指针长度?
如下面的例子:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于字符数组,sizeof给出来的是数组长度,对于字符指针,sizeof给出来的是指针的宽度。
如果你在这个函数内部处理,你得到的就只是指针变量的大小,不可能得到字符串长度。
字符串长度使用strlen。
如果你能确保字符串永远正确地以
\0
结尾,可以使用strlen而不再传递长度。因为c语言中,数组作为参数的时候,就是一个指针。
因此,在函数内,是不能通过sizeof得到这个指针所指字符串的长度的。得到的只是指针变量的长度。
sizeof一个字符串常量,比如"abcdef"。得到的是字符串实际的长度(包含结束符),这里是7。
如果传递进入函数,就会退化为一个普通的char *指针。这时sizeof就是指针的大小了,这里是4或8。但是strlen还是能得到长度的。
问题在于你得确保这个key是一个C字符串(0结束),才不需要长度。而真正的哈希值是二进制串,中间可能有\0。所以传递进入函数必须带长度,strlen无法得到正确长度。