如何在C中的调用函数中计算静态分配的字符串的大小?

How to calculate the size of the statically allocated string in the calling function in C?

如何获取函数check_size中的值200

#include <stdio.h>
#include <string.h>
int check_size(char *ptr)
{
    //if (sizeof(ptr) == 200)
    //{
    //   ...
    //}
    printf("%ld \n", sizeof(ptr));
    printf("%ld \n", sizeof(*ptr));
    printf("%ld \n", strlen(ptr));

    return 1;
}
int main()
{
    char ptr[200]="[=10=]";

    int s = check_size(ptr);
    return 0;
}

当数组用作函数参数时,它被转换为指向其第一个元素的指针。因此,函数无法获取作为参数传递的数组的大小。

关于您的尝试:

printf("%ld \n", sizeof(ptr));

由于 ptr 是一个 char * 这将为您提供该指针的大小(通常为 8)。

printf("%ld \n", sizeof(*ptr));

这将为您提供 ptr 指向的大小,特别是定义为 1 的 char

printf("%ld \n", strlen(ptr));

假设 ptr 指向一个以空字符结尾的字符串,这将为您提供字符串的长度。

数组大小需要作为单独的参数传入,函数才能知道。表达式 sizeof(ptr) 如果在 main 中使用,将为您提供数组的大小(以字节为单位)。

需要澄清的事情:被调用的函数没有 "array size" 的概念。它所给出的只是一个指向一个字节的指针。

现在,如果您要对数组进行特定的初始化,例如 199 个字符长度的字符串,您可以使用 strlen() 来完成。或者您可以传入数组大小,尽管这很简单。

但总的来说,这里无法完全按照您的要求进行操作。

How to get the value 200 in the function check_size?

而不是有一个函数接受一个 char*,有一个函数接受一个指向 char 数组 200 的指针。

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

int check_size(char (*ptr)[200]) {
  printf("%zu \n", sizeof(ptr));
  printf("%zu \n", sizeof(*ptr));
  printf("%zu \n", strlen(*ptr));
  return 1;
}

int main() {
  char ptr[200] = "[=10=]";
  check_size(&ptr);
  return 0;
}

输出

8 
200 
0 

GTG

How to get the value 200 in the function check_size? How to calculate the size of the statically allocated string in the calling function in C?

由于 ptr 的大小在编译时已知,并且您还应该在任何源代码中尽可能少地硬编码整数文字,因此只需使用宏常量来保存元素的数量。有了它,您可以轻松计算函数 check_size():

中数组的大小

Example program

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

#define length 200                            // macro constant `length`.

int check_size(char *ptr)
{
    printf("%zu \n", sizeof(*ptr));           // size of `char`
    printf("%zu \n", sizeof(*ptr) * length);  // size of the array.
    printf("%zu \n", sizeof(ptr));            // size of the pointer to `char`.
    printf("%zu \n", strlen(ptr));            // length of the string.

    return 1;
}

int main()
{
    char ptr[length] = "[=10=]";                  // macros can be used here.

    check_size(ptr);
    return 0;
}

输出:

1 
200 
8 
0