Friday, January 15, 2010

数组的长度

用高级语言用惯了, 想到得长度时, 一般有函数可以得到。对于C的数组, 我也是这样想的。至少还有一个sizeof

晚上和网友聊C的时候, 他贴了不少自己的笔记, 其中有这样一段:
 * 在函数参数中,array和*是一回事

从文字中, 我很明白它说的是什么意思. 但是很深的一层, 我还不了解数组, 连sizeof都不了解.

后面. 我在分析glibc/string/strlen.c的代码时, 这个问题让我重新深刻了解

在使用malloc分配空间时, 程序员是应该确切了解空间长度的. 否则后果严重.

那么, 数组的长度呢? 如:
void main(int argc, char *argv[])
{
  char s[10];
  printf("%d\n", sizeof(s));
}
输出为10

这个sizeof就让本人感觉到: 数组的长度是随时都可以得到的. 真是这样吗?

strlen.c的代码就让我提出了这个疑問:
1. 在strlen.c的函数出, 根本就没有sizeof的出现. 它就一个死循环, 去测试第一个'\0'.
2. 如果在某种情况下, 不知道参数的长度, 只有一种結果: 非法引用. 关于Segmentation, 可见: http://en.wikipedia.org/wiki/Segmentation_fault
* 某种情况是指刚刚好一直找不到'\0'

在使用strlen.c得到Segmentation fault, 是相当crazy的事!

数组参数也一样有这个问题, 这不是strlen.c里不使用sizeof的问题. 是因为sizeof也无法知道! 来个例子:

void print_len(char *p){
  printf("%d\n", sizeof(s));

}

void main(int argc, char *argv[])
{
  char s[10];
  print_len(s);
}

gcc直接就报错. 因为sizeof不能这样用. 可以大概猜出, sizeof的結果是编译器在编译时得到的值. 不是run time得到的.

可以猜出, 数组与malloc得到的连续空间的比较:
1. char a[10] 等于 char * const a = malloc(10);
2. 数组多一个在编译时得到长度的可行性
* char * const 和const char * 可是不同的哦


PS:
怪不得go lang的数组参数在调用时, 被要求测试数组的长度. 原来不是为了安全.
看来go lang像C一样强大, 又要比C安全, 是有道理的.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.