一、sizeof运算符的用法

1.sizeof运算符给出某个类型或变量在内存中所占据的字节数。

int a;  sizeof(a)=4;  //sizeof(int)=4;

double b;  sizeof(b)=8;  //sizeof(double)=8;

2.数组的sizeof值等于数组所占用的内存总字节数。

如:char a[] = "yes";  sizeof(a);  // 结果为4,字符末尾还存在一个NULL终止符

int a[3];  sizeof(a);  // 结果为3*4=12,3个int类型
在学数组和函数那块是遇到的sizeof就是在求数组的长度:

int a = sizeof(a1) / sizeof(a1[]); // 总长度/第一个元素的长度

3. 指针变量的sizeof值与指针所指的对象没有任何关系,所有的指针变量所占内存大小相等。(不同的编译器指针变量所占内存大小不同)

char *p = "abc";
int *q;
string *s;
sizeof( p ); // 结果为4
sizeof( q ); // 结果为4
sizeof( s ); // 结果为4

如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

void (*p)();// 函数指针

sizeof( p );// 结果为4

二、malloc函数(内存的动态分配)

1.malloc函数原型:

void *malloc(unsigned int size);

malloc向系统申请分配指定size个字节堆内存连续空间,返回类型是 void* 类型,void* 表示未确定类型的指针。在C语言中,void* 类型可以强制转换为任何其它类型的指针。

p = malloc (sizeof(int)*n);//隐式类型转换,分配n个整数内存空间
p = (int *) malloc (sizeof(int)*n);//显式强制类型转换,分配n个整数内存空间

函数返回值是所分配区域的第一个字节的地址,如果申请分配内存失败,则返回空指针(NULL)。

2.申请了内存空间后,必须检查是否分配成功。

q=(DLNode *)malloc(sizeof(DLNode));
if(!q) return OVERFLOW;

3.虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但习惯上进行显式强制类型转换。

三、free函数的用法

1.free函数原型:

void free(void *p);//无返回值

free()函数释放变量p所指向的动态内存空间,p应该是最近一次调用malloc函数时得到的函数返回值。

free( p );//释放动态空间

2.当不需要再使用申请的内存时,一定要记得释放,如果申请后不释放就会造成内存泄漏。

3.malloc函数和free函数应该是配对使用的,且释放只能一次。

最后,sizeof在后面的结构体和联合体中用的会更深入一些,待学到那块时再来补充总结。

sizeof运算符、malloc函数及free函数的更多相关文章

  1. sizeof运算符和strlen函数的区别

    1.sizeof是运算符,而strlen是函数. 2.sizeof操作符的运算结果为size_t,他在头文件中的typedef为unsigned int.该类型保证能容纳所操作对象的最大字节大小. 3 ...

  2. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  3. sizeof运算符和strlen()函数

    首先放上代码和运行结果.(在VC6.0上运行) #include<stdio.h> #include<string.h> int main(void) { char s1[]= ...

  4. C语言中malloc()和calloc()c函数用法

    C语言中malloc()和calloc()c函数用法   函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...

  5. C++malloc,calloc,realloc,free函数

    在进行C/c++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别:     1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等, ...

  6. malloc,free,calloc,realloc函数

    malloc函数 原型:extern void* malloc(unsigned int size): 功能:动态分配内存: 注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故 ...

  7. malloc函数、calloc函数和free函数

    malloc函数和free函数 malloc函数原型:void *malloc(long NumBytes) malloc原型说明:mallco函数在堆分配了NumBytes个字节的内存空间,用来存放 ...

  8. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  9. C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...

随机推荐

  1. Win10重置 系统诸多设置或者菜单点击无效或者异常信息回复办法

    cmd: 输入下列脚本重新注册DLL文件,待执行完毕后重启电脑 for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1

  2. Python生成器(yield)

    对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在 ...

  3. C#比较两个日期的大小 .net

    using System;using System.Collections; public class MyClass{public static void Main(){DateTime dt1 = ...

  4. PL/SQL实现JAVA中的split()方法的小例子

    众所周知,java中为String类提供了split()字符串分割的方法,所以很容易将字符串以指定的符号分割为一个字符串数组.但是在pl/sql中并没有提供像java中的split()方法,所以要想在 ...

  5. winxp精简版没有IIS的解决办法

    首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,系统会自动使用记事本打开sysoc.inf这个文件.在sysoc.inf中找到“[Components]”这一段 ...

  6. Android 4.0 Launcher2源码分析——主布局文件(转)

    本文来自http://blog.csdn.net/chenshaoyang0011 Android系统的一大特色是它拥有的桌面通知系统,不同于IOS的桌面管理,Android有一个桌面系统用于管理和展 ...

  7. sql server 游标fetch简单用法

    //遍历tmp_check的年份和月份 DECLARE @year ) DECLARE @month ) DECLARE cur CURSOR FOR SELECT nf,yf FROM tmp_ch ...

  8. Python+selenium第一个自动化脚本

    第一个自动化脚本(用Python写的) from selenium import webdriver  #从selenium导入webdriber driver=webdriber.Firefox() ...

  9. 【C++】四种排序算法的时间比较

    四种排序算法的时间比较 [注]clock函数对输入(用户输入)元素N排序的计时 #include<iostream> #include<time.h> using namesp ...

  10. Spring 团队开源 nohttp,尽可能不用 HTTP

    Spring 团队开源 nohttp 项目,用以查找.替换和阻止 http:// 的使用. 项目是为了在可能使用 https:// 的情况下不使用到 http://,确保不会发生中间人攻击.Sprin ...