程序内存分配:
![](https://img.haomeiwen.com/i8911703/55d108a4a9af0584.png)
![](https://img.haomeiwen.com/i8911703/06f5667472fa46dd.png)
练习1:
![](https://img.haomeiwen.com/i8911703/8f1a072a0fdd7e1c.png)
在函数里声明的static变量,只对该函数可见,但my_var_initialized只被创建和初始化一次。
![](https://img.haomeiwen.com/i8911703/a690c5e1752570c6.png)
第一次调用时,if语句中的条件my_var_initialized是全局变量,为false,函数内部赋值之后,第二次调用,my_var_initialized为true,直接返回。
两个代码结果是一样的。
练习2:
var_ptr = (int *)malloc(sizeof(int)); 格式:(指针类型)malloc(大小)
练习3:
1.多了一个=号。。。。或者应该array_size-1
2.应该写成int *a = (int *)malloc(sizeof(int *)* array_size)
3.字符串要+1,有‘\0’
原型:extern int strlen(char *s);
用法:#include
功能:计算字符串s的(unsigned int型)长度
说明:返回s的长度,不包括结束符NULL。
strcpy函数并不检查目的缓冲区的大小边界,而是将源字符串逐一的全部赋值给目的字符串地址起始的一块连续的内存空间,同时加上字符串终止符。可以使用另一个具有相同功能的函数: strncpy,该函数可以指定要复制的字符串的长度。
strcpy_s更为安全,在使用strcpy_s,使用两个参数的时候要特别注意的一点是,两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数。new出来的字符串,提示不支持两个参数,所以必须用三个参数的。
![](https://img.haomeiwen.com/i8911703/c30caa8ffedebca9.png)
strcat用于将两个char类型链接的函数。
函数原型:extern char *strcat(char *dest,char *src);
参数:
dest 目标数组指针
src 源字符串指针
返回值:返回指向dest的指针
函数功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
注意事项:
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
4.
![](https://img.haomeiwen.com/i8911703/b4b618a0801b69a0.png)
溢出,超出数组r的已分配内存
5.
![](https://img.haomeiwen.com/i8911703/c5888ead1ebc6d54.png)
写入冲突,内存溢出。strcat不是新分配一块内存来存合并后的字符串,而是将src的内容写在dest的后面并返回dest的指针。但原代码中的dest是字符串常量,无法写入。
6.--先执行,然后才是*。(虽然他们俩优先级相同但是结合方式是由右向左的)。所以最后减的是地址,最好加上括号~
![](https://img.haomeiwen.com/i8911703/165daf8b757e2645.png)
![](https://img.haomeiwen.com/i8911703/6abe99a8851e5101.png)
7.函数调用完成会回收局部变量,不要返回局部变量的指针。
练习4:
1.如果直接返回了,那么full_msg就没有被释放,导致内存泄漏。
2.应该把p指向的string也释放掉
网友评论