【问题标题】:How to calculate the size of the statically allocated string in the calling function in C?如何计算C中调用函数中静态分配的字符串的大小?
【发布时间】:2020-03-10 13:59:53
【问题描述】:

如何在函数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]="\0";

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

【问题讨论】:

  • 不使用智能指针就无法做到这一点。
  • 在这段代码中,ptr 不是动态分配的内存。很难确定 100%,如果操作系统无法分配 200 字节的内存,程序执行甚至会无法启动。因此,谈到一致的操作系统,一旦进程启动并运行,您就可以确定分配了 200 字节的内存。
  • size_t 的正确格式说明符是sizeof()strlen() 返回的内容,是%zu

标签: c string function size sizeof


【解决方案1】:

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

关于你的尝试:

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

由于 ptrchar *,这将为您提供该指针的大小(通常为 8)。

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

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

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

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

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

【讨论】:

  • 是的,我得到最后一个打印语句的 0。那么我应该将什么作为参数传递给 check_size 函数以检查传递的 char 数组的大小是否分配为 200?
  • @Sethuraman 这就是问题所在,你不能。您只能在定义它的范围内的数组上使用sizeof。因此,任何需要知道数组大小的函数都必须显式传递它。
  • 感谢您的澄清。我现在明白这是 C 的一个缺点。
【解决方案2】:

如何在函数check_size中获取值200? 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] = "\0";                  // macros can be used here.

    check_size(ptr);
    return 0;
}

输出:

1 
200 
8 
0 

【讨论】:

  • 这对我来说似乎是一个可行的解决方案。通过使用被调用函数和调用函数共有的全局长度定义。谢谢。
【解决方案3】:

需要澄清的一点:被调用的函数没有“数组大小”的概念。它所给出的只是一个指向一个字节的指针。

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

但总的来说,这里没有办法完全按照您的意愿行事。

【讨论】:

    【解决方案4】:

    如何在函数check_size中得到200的值?

    具有接受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] = "\0";
      check_size(&ptr);
      return 0;
    }
    

    输出

    8 
    200 
    0 
    

    GTG

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2017-08-01
      • 2020-01-04
      • 2011-04-20
      相关资源
      最近更新 更多