这可能吗?[指向char数组C的指针]

Ulr*_*ira 2 c arrays pointers char

这可能吗?

size_t calculate(char *s)
{
    // I would like to return 64
}

int main()
{
    char s[64];

    printf("%d", calculate(s));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个函数来计算声明的char数组的大小main().

Jon*_*ler 6

calculate()仅使用指针参数s,您的函数无法计算数组的大小.数组的大小不是在指针中编码,也不是从指针访问.如果它被设计为采用以null结尾的字符串作为参数,它可以确定该字符串的长度; strlen()当然,那是什么呢.但是如果它想知道它可以安全地复制到数组中的信息量,就必须告诉数组有多大,或者假设有足够的空间.

正如其他人所指出的那样,sizeof()运算符可以在数组定义可见的函数中使用,以获得数组的大小.但是在无法看到数组定义的函数中,您无法有效地应用sizeof()运算符.如果数组是一个全局变量,其定义(非声明)在范围(可见)中calculate()写入 - 而不是函数的参数 - 则calculate()可以指示大小.

这就是许多C函数占用指针和长度的原因.缺乏信息是为什么C有些人容易误用它并产生"缓冲区溢出"错误,其中代码试图将一加仑信息装入品脱罐中.


use*_*016 5

在静态声明时,char[]您可以使用运算符sizeof,在这种情况下将返回64.

printf("%d", sizeof(s));
Run Code Online (Sandbox Code Playgroud)

在动态声明时char*,无法获得已分配内存的大小.

动态数组是通过malloc和朋友获得的.所有其他的都是静态声明的,你可以使用sizeof它们,只要你在与声明数组相同的范围内使用它(例如,在你的情况下,相同的函数).