如何在C语言中找到无符号字符指针的长度?

3
我希望在一个函数中查找无符号字符指针的大小或长度,该指针是该函数的参数。在指针声明附近,大小显示正确。
但是,在函数中尝试查找大小时,它会返回 4。
我应该怎么做?
#include <stdio.h>
//void writeFile(unsigned char *da);
void writeFile(char *da);
int main(int arc,char **argv)
{

 unsigned char block_bmp[]=
{
   0x0,0xff,0xff,0xff,0x0,0x0,0x0,0xff,0xff,0xff,0x0,0x0,0x0,0xff,0xff,0xff,//*16bytes*
};
printf("size::%d\n",sizeof(block_bmp));
writeFile(block_bmp);
}

//void writeFile(unsigned char *da)
void writeFile(char *da)
{
printf("%d\n",__LINE__);
printf("size::%d\n",sizeof(da));
printf("length::%d\n",strlen(da));
FILE *fp;
int i;
fp=fopen("/tmp/hexfile","wb");
for(i=0;i<3780;i++)
    fprintf(fp,"%c",da[i]); 
//  fwrite(da,sizeof(unsigned char),sizeof(da),fp);
fclose(fp);
}

1
你混淆了类型的 大小 和字符串的长度。如果你需要后者,只需使用 strlen - Oliver Charlesworth
你能上传你的代码吗?这样可以让你的问题更清晰明了。 - LearningC
4个回答

4
如果它指向一个以NULL结尾的字符串,使用strlen。如果不是,则该指针只是被调用函数的一些内存地址,没有关于数组大小的任何其他信息(我假设您正在尝试传递一个数组)。我建议将数组元素的数量作为附加参数传递给函数。

谢谢您的建议。我不能要求用户传递数组元素的数量。我应该编写一个方法,以便用户可以将无符号字符指针作为参数传递给我的方法。在我的方法中,我必须找到它的长度。 - QtUser
5
如果它是一个字符串,那么你就有解决方案。如果它不是一个字符串(即没有以空字符结尾),那么就没有解决方案。 - Oliver Charlesworth
吹毛求疵:C语言中的“字符串”要么以NUL0null结尾,而NULL则是另外一回事。 - alk

3

在这种情况下,你不能使用sizeof。如果字符数组以NULL结尾,应该使用strlen

当你将数组传递给函数时,它会衰退为指针,你不能使用sizeof获取数组的大小。在32位机器上,sizeof将给出4个字节。

例如:

#include <stdio.h>
void fun(int myArray[10])
{
    int i = sizeof(myArray);
    printf("Size of myArray = %d\n", i);
}
int main(void)
{
    // Initialize all elements of myArray to 0
    int myArray[10] = {0}; 
    fun(myArray);
    getch();
    return 0;
}
/**************OUTPUT**************
Size of myArray = 4
***********************************/

1
unsigned char array[100];
// sizeof(array) == 100

unsigned char* ptr = array;
// sizeof(ptr) == 4 for 32 bit platform.

当您调用函数时,例如:

 foo(unsigned char* ptr)
 {
 }

当使用'array'作为参数时,你只会看到一个'unsigned char *',而不是一个有100个元素的数组。这就是为什么'sizeof'返回4的原因。


@R Sahu:确实,这就是我的问题。我猜我的问题是没有合适的解决方案。 - QtUser
@QtUser 如果您发布更多的代码,这里的人们可能会提供帮助。 - R Sahu

0

指针大小sizeof(any_pointer_variable)不会取决于它将要指向的数据类型。指针的大小大多数情况下是4,这就是你在函数中得到的。而且它不依赖于它所指向的内容。所有指针的大小都相同,无论它们指向什么类型。


2
这是误导性的,指针的大小与整数的大小无关。 - Oliver Charlesworth
@OliCharlesworth 是的,我通常这样说。因为我发现大多数时候他们都是这样的。是的,这并不是必要的。 - LearningC
1
有没有 sizeof(int) 等于 8 的 64 位系统?我从未见过这样的情况,所以“通常”在这里是错误的。 - keltar
好的,我修改了我的答案。谢谢。 - LearningC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接