`
ChuanSu
  • 浏览: 53315 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

C语言 sizeof

阅读更多
1, C语言 sizeof用法以及需要特别注意的地方;
2, sizeof 与 strlen()的区别;

要想弄明白这两点其实很简单,先来看下 sizeof 的定义

The C Programming Language 写道
C provides a compile-time unary operator called sizeof that can be used to compute the size of any object. The expressions
sizeof object
and sizeof(type name)
generates an integer to the size of the specified object or type in in bytes.
.
MSDN 写道
The sizeof operator gives the amount of storage,in bytes, required to store an object of the type of the operand.
.
C语言 基本数据类型(primary data type)有int,double,char,long,可以看下面的代码来知道这些基本类型的size
void test_size(void)
{
	printf("sizeof(int):%d\n",sizeof(int));
	printf("sizeof(double):%d\n",sizeof(double));
	printf("sizeof(char):%d\n",sizeof(char));
	printf("sizeof(long):%d\n",sizeof(long));	
}

sizeof(int): 4
sizeof(double): 8
sizeof(char) : 1
sizeof(long) : 4

对于pointers(指针),可以看下面代码
void pointers_size(void)
{
	char *p = "Chuan Su";
	int *p1;
	int a = 9;
	p1 = &a;
	double *p2;
	double b = 9.00;
	p2 = &b;
	char **p3;
	p3 = &p;

	printf("sizeof(p):%d\n",sizeof(p));
	printf("sizeof(p1):%d\n",sizeof(p1));
	printf("sizeof(p2):%d\n",sizeof(p2));
	printf("sizeof(p3):%d\n",sizeof(p3));
}

sizeof(p): 4
sizeof(p1): 4
sizeof(p2): 4
sizeof(p3): 4

由上面的代码可以看出,指针变量所占的内存与指针所指的对象没有任何关系,均为 4 bytes。
对于 sizeof "array" 数组的size,先看下面代码

void array_size(void)
{
	char string[] = "Chuan Su";
	int a[5];

	printf("sizeof(string):%d\n",sizeof(string));
	printf("lengthof(string):%d\n",strlen(string));
	printf("sizeof(a):%d\n",sizeof(a));
}

sizeof(string): 9
lengthof(string): 8
sizeof(a): 20

首先来看array所占的内存,再来看sizeof与strlen的区别
The C Programming Language 写道
When a string constant like "hello\n" appears in a C program, it is stored as an array of characters containing characters of the string and terminated with a '\0' to mark the end.

所以char string[] = "Chuan Su"的所占的内存,即size为
(8+1)*1 = 9;
而 int a[5]所占的内存,即size为
5*4 = 20 // ( 5*sizeof(int)= 20 bytes );
如果想要得到 int a[5]的长度,可以这样 sizeof(a)/sizeof(int)
说到这里,我想请大家注意的一点是,先看下面的代码

void array_size(char string[8])
{
	printf("sizeof(string):%d\n",sizeof(string));
	printf("lengthof(string):%d\n",strlen(string));
}

sizeof(string): 4
lengthof(string): 8
这里对形参char string[8] 所得到的size是 4 而非上面所说的 9,在" C专家编程 " 一书中在分析指针和数组的时候作了很好的解释
C专家编程 写道
C语言允许程序员把形参声明为数组(程序员打算传递给函数的东西)或者指针(函数实际所接收到的东西)。编译器知道何时形参是作为数组声明的,但事实上在函数内部,编译器始终把它当作一个指向数组第一个元素(元素长度未知)的指针。
因此很有意思,没有办法把数组本身传递给一个函数,因为它总是被转换为指向数组的指针。当然,在函数内部使用指针,所能进行的对数组的操作几乎跟传递原原本本的数组没有差别。只不过,如果想用 sizeof(实参)来获取数组的长度,所得结果不正确而已。

所以此处所求为 指针的size而非数组的size

下面来看下sizeof和strlen()的区别
二者有本质上的区别 从上面的定义可以知道sizeof只是一个operator,而strlen()则是定义一个定义在<string.h>中的函数;所以sizeof(string)是在计算string所占用的内存,包含了'\0'结尾符,strlen(string)则是用来计算字符串的长度,省略了'\0'

接下来,看下SIZE OF STRUCTURES。 在 "Programming in ANSI C" 一书对此有如下解释

Programming in ANSI C 写道
The expression sizeof(struct x)
will evaluate the number of bytes required to hold all the members of the struct x. If y is a simple structure variable of struct x,then the expression
sizeof(y) would give the same answer.However,if y is an array of variable of type struct x,then the sizeof(y)
would give the total number of bytes the array y requires.
The expression
sizeof (y) / sizeof (x)  or  sizeof (y) / sizeof y[0] would give the number of elements in the array y




讲了这么多,总之,对sizeof用法的理解,还是回归定义,仔细理解下文章开头的两处定义的引用,以后是不会用错的。

刚开始学C语言,先写到这里,以后有新的发现再补上。



分享到:
评论

相关推荐

    C语言sizeof用法[借鉴].pdf

    C语言sizeof用法详解 C语言中,sizeof是一个操作符(operator),用于返回一个对象或者类型所占的内存字节数。它的返回值类型为size_t,定义在头文件stddef.h中。 sizeof的作用是简单地返回一个对象或者类型的内存...

    解析C语言中的sizeof.rar

    在C语言中,`sizeof`是一个非常重要的运算符,它用于获取任何数据类型或变量所占用的内存字节数。这个运算符对于理解和优化代码、处理内存分配以及了解底层计算机工作原理都至关重要。下面我们将详细探讨`sizeof`的...

    c语言sizeof详解

    C语言sizeof详解 sizeof是C语言中一种重要的单目操作符,它可以返回变量或数据类型的存储大小,以字节为单位。sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,该类型保证能容纳实现所...

    详细解析C语言中的sizeof

    ### 详细解析C语言中的`sizeof` #### 一、`sizeof`的概念 `sizeof`是C语言中的一个单目操作符,类似于其他操作符如`++`和`--`等。需要注意的是,`sizeof`不是函数,而是用来获取操作数(可以是一个表达式或类型名...

    C语言中sizeof函数的基本使用总结

    sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等,sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。这个操作数不好理解对吧?后面慢慢看就明白了。...

    c语言中sizeof的用法.pdf

    C语言中sizeof的用法.pdf C语言中sizeof的用法是非常重要的知识点,它可以告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时开辟的空间大小,以字节为单位。 sizeof是一个运算符,不是...

    C语言函数sizeof

    ### C语言中的`sizeof`操作符详解 #### 一、`sizeof`操作符的基本概念 `sizeof`是C语言中的一个单目操作符,用来获取指定类型或变量的存储大小,通常以字节为单位。它并非是一个真正的函数,而是一种特殊的语法...

    解析C语言中的sizeof.docx

    C语言中的sizeof操作符 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的...

    C语言介绍sizeof的使用方法,可以直接编译使用

    程序通过简洁的代码展示了如何使用sizeof来查找各种变量类型的大小,这是C语言编程中重要的一环,非常适合初学者进行学习。 程序的主要目标是确定各种类型的变量在内存中的大小。 程序的开头,我们包含了stdio.h...

    解析C语言中的sizeof

    C语言中的sizeof操作符 在C语言中,sizeof是一个单目操作符,它可以用来计算变量或类型的存储大小。本文将详细介绍sizeof的概念、使用方法、结果、与其他操作符的关系、主要用途和建议。 一、sizeof的概念 sizeof...

    详细解析C语言中的sizeof.docx

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取任何数据类型或变量在内存中占用的字节数。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个操作符而不是一个函数,这意味着它在编译时就被计算,...

    C语言中的sizeof使用方法.docx

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取数据类型或者变量在内存中占用的字节数。这个操作符对于理解和优化代码的内存使用是至关重要的。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个...

    C语言中的sizeof使用方法.pdf

    在C语言中,`sizeof`是一个非常重要的操作符,它能够返回一个类型或者变量在内存中占用的字节数。这个操作符可以帮助我们理解和优化程序的内存使用,尤其是在处理数组、结构体和指针时。下面我们将详细探讨`sizeof`...

    解析C语言中的sizeof.pdf

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取任何数据类型或变量在内存中占用的字节数。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个操作符,而非函数,它能够返回一个表达式或类型所占的...

    C语言中sizeof()与strlen()函数的使用入门及对比

    在C语言中,`sizeof()`和`strlen()`是两个非常重要的运算符和函数,它们各自服务于不同的目的。本文将深入探讨这两个概念,并提供一些实际应用的例子。 `sizeof()`是一个运算符,而不是函数,这意味着它的计算是在...

    详细解析C语言中的sizeof.pdf

    C 语言中的 sizeof 操作符详解 sizeof 操作符是 C 语言中的单目操作符,它以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。sizeof 操作符的结果类型是 size_t,它在头文件中 ...

    详细解析C语言中的sizeof (2).pdf

    C 语言中的 sizeof 操作符 sizeof 操作符是 C 语言的一种单目操作符,它可以用来获取变量或数据类型的存储大小。sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为 unsigned int 类型。 一、sizeof 的...

    详细解析C语言中的sizeof (2).docx

    C 语言中的 sizeof 操作符 在 C 语言中,sizeof 是一种单目操作符,用于获取操作数的存储大小。它可以用于数据类型、变量、数组、结构体、联合体和指针等多种类型的操作数。 sizeof 的概念 sizeof 操作符以字节...

Global site tag (gtag.js) - Google Analytics