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

时间:2011-05-04 14:05:02

标签: 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;
}

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

6 个答案:

答案 0 :(得分:6)

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

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

这就是许多C函数占用指针和长度的原因。缺少这些信息是为什么C在某种程度上容易让人误用它并产生“缓冲区溢出”错误,其中代码试图将一加仑的信息放入品脱罐中。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

是的,如果s在其数组的末尾有特定字符,则可能。例如,您可以拥有s[63] = 125并且知道从0到62的每个其他字符都不是125,您可以执行for循环,直到找到125并返回数组的大小。

否则,这是不可能的,因为函数参数中的s只是指向数组的指针,因此sizeof(s)内的calculate只返回机器指针大小,而不是64有人可以期待。

答案 3 :(得分:1)

不幸的是,您无法单独从指针值确定相应数组中有多少个元素。你需要在数组中使用某种类型的sentinel值(比如用于字符串的0终止符),或者你需要单独跟踪它。

可以做的是使用sizeof运算符获取数组中的字节数或元素数:

char arr[64];

size_t size = sizeof arr;                 // # of bytes in arr
size_t count = sizeof arr / sizeof *arr;  // # of elements in arr

但是,这只适用于arr是数组类型的情况;如果您尝试在函数中执行此操作

 size_t calculate(char *s)
 {
   return sizeof s;
 }

它将返回指针值的字节的大小,而不是相应的数组对象。

答案 4 :(得分:1)

没有。 char *xchar x[]只是创建一个指向内存位置的指针。指针不包含有关内存区域大小的任何信息。

但是,char *x = "Hello"占用6个字节(包括终止空值),strlen(x)将返回5.这依赖于字符串末尾的空字符,strlen仍然不了解底层字符串缓冲。所以strlen("Hello\000There")仍然是5。

答案 5 :(得分:-1)

这通常使用C中的宏来完成,例如:

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))

这是一个好主意是一个完全不同的问题。