c编程,如何通过使用指针作为参数的函数获取变量的sizeof?

c programming, How can i get the sizeof a variable through a function using a pointer as a parameter?

如何通过使用指针作为参数的函数获取变量的大小?

readEachChar(unsigned char * input){
      printf("The the size of the string %zu", sizeof(input));

      for (size_t i = 0; i < sizeof(input); i++) // currently it show me the size of the pointer (8 bytes)
      {
        printf("[%x]",input[i]);
      }
      printf("\n");
      
   }


unsigned char text[] = "thisisalongkindofstring";

int main(){
readEachChar(&text);
return 0;
}

对于初学者来说,这个调用中的参数表达式

readEachChar(&text);

具有类型 unsigned char ( * )[24]。但是函数参数的类型 unsigned char * 是不兼容的类型。

因此编译器应该发出一条消息。

如果你会写

readEachChar(text);

然后在函数中你应该像

一样调用函数strlen
  for (size_t i = 0, n = strlen( input ); i < n; i++)
  {
    printf("[%x]",input[i]);
  }

否则,如果传递的数组不包含字符串,则必须使用第二个参数声明该函数,该参数将分配给传递的数组中的元素数。

在行

printf("The the size of the string %zu", sizeof(input));

sizeof 运算符将为您提供指针的大小 input。它不会给你它指向的对象的大小(可能是数组的大小或字符串的长度)。

在函数main中,定义

unsigned char text[] = "thisisalongkindofstring";

将使 text 成为一个包含 24 个字符的数组:这 24 个字符由 23 个实际字符和一个空终止字符的额外字符组成。在 C 中,根据定义,字符串是由空字符终止的字符序列,即具有字符代码 0.

的字符

因此,为了确定字符串的长度,必须对字符串的每个字符进行计数,直到遇到终止空字符。你可以自己做,也可以使用 C 标准库提供的函数 strlen

此外,对于字符串的单个字符,通常使用 char 数据类型,而不是 unsigned char。 C 标准库的所有字符串处理函数都需要 char * 类型的参数,而不是 unsigned char *,因此,根据您的编译器,混合这些数据类型可能会给您警告甚至错误。

另一个问题是这一行是错误的:

readEachChar(&text);

函数readEachChar似乎期望函数参数是指向字符串第一个字符的指针,而不是指向整个数组的指针。因此,您应该写 &text[0] 而不是 &text。你也可以简单地写 text,因为这个表达式将 automatically decay&text[0].

应用上述所有修复后,您的代码应如下所示:

#include <stdio.h>
#include <string.h>

void readEachChar( char * input )
{
    size_t len = strlen( input );

    printf( "The size of the string: %zu\n", len );

    for ( size_t i = 0; i < len; i++ )
    {
        printf( "[%x]", input[i] );
    }

    printf("\n");  
}

int main()
{
    char text[] = "thisisalongkindofstring";

    readEachChar( text );

    return 0;
}

这个程序有以下输出:

The size of the string: 23
[74][68][69][73][69][73][61][6c][6f][6e][67][6b][69][6e][64][6f][66][73][74][72][69][6e][67]

你不能只要求 sizeof(pointer) 因为你会得到指针本身的大小。 取而代之的是-您可以更改函数以获取大小作为参数:

readEachChar(unsigned char * input, unsigned size)

并从 main 发送尺寸:readEachChar(&text, sizeof(text));

另一种解决方案是 运行 遍历字符,直到到达空值 - 末尾的 '\0' 并计算其中的字符数 - 这就是 strlen 函数的作用。

How can i get the sizeof a variable through a function using a pointer as a parameter?

printf("The the size of the string %zu", sizeof(input)); 确实打印变量input的大小,它是一个指针。明显的 OP 想要其他东西的大小,例如 text[].

的大小

要获取对象的大小,请将该大小传递给函数。

void foo_sz(size_t sz) {
  printf("Size: %zu\n", sz);
}

// Call
foo_sz(sizeof text);

要获取对象的大小和对象的地址,请同时传递两者。

void foo_both(size_t sz, void *ptr) {
  printf("Size: %zu\n", sz);
  printf("Ptr: %p\n", ptr);
}

// Call
foo_both(sizeof text, text);

通过使用指针作为参数的函数获取变量的大小,每个类型的原型

//  123456789012345678901234
// "thisisalongkindofstring"

void foo_1(unsigned char (*ptr)[24]) {
  printf("Size: %zu\n", sizeof *ptr);
  printf("Ptr: %p\n", (void *) ptr);
}

// Call
foo_1(&text);

当然现在代码失去了通用方面,但确实满足了“使用指针通过函数调整变量大小”的目标。


或者考虑使用宏来调用 1 个参数,但同时传递大小和地址。

#define FOO_M(obj)  foo_both(sizeof(obj), &(obj))

// Call
FOO_M(text);

如果 obj 是 VLA 或表达式,则存在其他问题。