sizeof 在笔试中经常遇到,在此做个总结。
#include <stdio.h>
#include <stdlib.h>
void fun(char temp[])
{
printf("in function: %d\n", sizeof(temp));
}
int main()
{
int a = 10;
char ch = 'c';
int c[10];
char cha[] = "hutuyang";
char *string = "hutuyang";
char *str1 = "name\0";
char *p = (char*)malloc(sizeof(100));
printf("char cha[] %d\n", sizeof(cha));
printf("char *p (malloc) %d\n", sizeof(p));
printf("int a %d\n", sizeof(a));
printf("char ch %d\n", sizeof(ch));
printf("int c[] %d\n", sizeof(c));
printf("string %d\n", sizeof(string));
printf("str1 %d\n", sizeof(str1));
fun(cha);
free(p);
return 0;
}
输出:
char cha[] 9
char *p (malloc) 4
int a 4
char ch 1
int c[] 40
string 4
str1 4
in function: 4
sizeof计算变量所占字节数是由编译器完成的,而并非如同printf 那样通过调用函数实现。
上面的例子中有几种比较容易出错:
sizeof(cha) = 9
sizeof(p) = 4 这里不等于malloc分配的大小主要是sizeof 只返回变量的大小,不返回变量指向的内存空间的大小。对于 char *p 而言,它指向的是一个存储在常量区的字符串,但究其p其本身而言,仍是一个指针,在32位机中,c语言的指针类型的变量大小都是4个字节。
fun() 中为什么只为4个字节呢? 因为在c中,默认会将函数形参为数组类型的修改为指针类型。故sizeof(temp) 实际上是在计算一个指针类型变量的大小。