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),为什么不在函数内部处理呢?是不是有什么需要特殊处理的?

阅读 6.4k
3 个回答

对于字符数组,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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进