代码改变世界

c sizeof

2010-12-05 22:17  OCaml  阅读(263)  评论(0编辑  收藏  举报
1、sizeof到底是什么:sizeof是一元运算符(Unary operator)
   语法规则如下:

sizeof unary-expression
sizeof ( type-name )

 
2、sizeof与结构体和联合体:

struct test {
    char c;
    int a;
    double d;
};

当时我认为所占的空间是:13(这个结果肯定是不对的!)。

其实用sizeof算出来的值是:16(微软的编译器、gcc的结果)这里面存在着一个内存对齐的问题:
我要弄清楚的就是为什么要对齐、怎么对齐。
 
3、sizeof的返回值:
这是个让我心痛到永远的问题。因为我犯过错在这个问题上!

#include<stdio.h>


int main()
{
    int i;
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};

    if (sizeof(arr) > -1) {
        printf("unsigned > int/n");
    } else {
        printf("int > unsigned/n");
    }
    return 0;
}

结果是:int > unsigned。其实原因很简单。sizeof的结果是一个unsigned类型的整数。

 
4、sizeof与形参:其实这个问题和sizeof没有太大的关联。列在这里是为了自己更好的记住。
先看看一个简单的示例:

#include<stdio.h>
void func(char *s) {
    printf("the size of the pointer:%u/n", sizeof(s));
}
int main()
{
    char str[20] = "hello the world!";
    printf("the size of the str :%u/n", sizeof str);
    func(str);
    return 0;
}

main中是20,func中是2。这个里面关键是参数的传递。数组类型-->指针类型了。这里就不多说了。要了解的可以网上查查资料。

5、sizeof('a')的秘密:在gcc和微软的编译器下测试都是4. 这里返回的结果是编译器自己设置的。

6、自己实现的sizeof功能的代码:
 

#define sizeof_v(value) (size_t)((char *)(&(value) + 1) - (char *)(&(value)))
#define sizeof_t(type) ((size_t)((type *)0 + 1))


很明显没有什么健壮性可言。我在glibc中查找:#define sizeof没有结果。哪位大侠知道在那个文件里面通知我一下。我真的很想看看到底怎么实现的。我的邮箱:camel_flying@163.com