C语言深入学习--checklist5:sizeof、指针、动态分配内存

# include <stdio.h> void MyFun(int x); void (*FunP)(int); typedef void (*FunPtr)(int); //定义某一函数指针的类型 int main(int argc, char* argv[]) { MyFun(10); FunP = &MyFun; (*FunP)(20); //调用方式1 FunP(30); //调用方式2 FunP = MyFun; (*FunP)(40); //调用方式3 FunP(50); //调用方式4 FunPtr p1; p1 = MyFun; p1(60); (*p1)(70); p1 = &MyFun; p1(80); p1(90); return 0; } void MyFun(int x) { printf("%d/n",x); } sizeof

1.       对于字符数组,sizeofstrlen的值是否相同?

字符串数组,最后一个都是结束符’/0’sizeof()计算占据的总内存空间,而strlen只是计算除开’/0’的字符数(可以见标准库的strlen的实现)

2.       Sizeof本质上是函数还是宏?

Sizeof是一个运算符。

3.       Sizeof返回值是什么?

Sizeof返回值是size_t,定义为unsigned int

 

 

指针

1.  int *p; &p,p,*p各有什么意思?

&p:该指针的地址;

P:该指针的内容:一个内存地址;

*p:p中内存地址对应相应的值;

2. 你定义的指针初始化了没?

3. 你理解指针的指针的概念吗?你会使用吗?

指针的指针:它的内容就是一个指针(地址), :如char **argv;如指针数组char *p[10]

4.  你会定义函数指针?

void (*p)(int )

P是一个指针,它指向了一个函数,该函数没有返回值,参数是一个int变量;

typdef void (*p)(int);

p f1;

p f2;就可以类似地定义函数指针了。

5.你会使用函数指针调用函数吗?

 

    函数名与函数指针都一样的,都是函数指针。函数名是一个const函数指针,而函数指针是一个函数指针变量。至于四种调用方法都可以,那是C语言的设计者规定的,主要是书写和阅读方便.

 

 

动态分配内存

1.  动态分配的内存放在什么地方?

堆。

2.什么情况下要动态分配内存?

http://topic.csdn.net/u/20100105/14/41be196f-a5a8-4521-b771-8ecf2292bd70.html

malloc使用的情况一般有两种:
1.
需要申请的内存太大了,一般栈的内存为1M,如果数组大于栈内存,就要malloc
2.
申请的内存大小不定,例如你要使用大小为n的内存,但是n是多少你并不知道,这时没法用char k[n];因为编译器不支持你用变量n来声明数组,此时要用malloc

2.       动态申请的内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?

在博文htp://www.cnblogs.com/da6wei6/archive/2008/09/07/1286400.html中,介绍了很多检测内存泄露的工具。

C专家编程中》的第七章亦对该问题有描述,简单摘要如下:

避免内存泄露:

每次当调用malloc分配内存的时候,注意在以后调用相应的free来释放它。

一种简单的方法就是在可能的时候使用alloca()来分配动态内存,以避免出现上述情况。当离开调用alloca的函数,它所分配的内存会被自动释放。(注:alloca函数是依赖于机器和编译器的,没有较好的可移植性,注意不要使用free释放alloca分配的空间.

如何检测内存泄露

1.       使用swap命令观察还有多少可用的交换空间

在一分钟内键入该命令三到四次,看看可用的交换区是否在减小。如果发现不断有内存被分配且从不被释放,一个可能的解释就是出现了内存泄露;

2.       确定可疑的进程,看看它是不是该为内存泄露负责。

使用ps – lu用户名来显示所有进程的大小。同样数次重复这个命令,如果一个进程不断增长而从不缩小,那么它就有可能出现了内存泄露。

 

你可能感兴趣的:(C语言深入学习--checklist5:sizeof、指针、动态分配内存)