易错点
越界问题
void test(){ char buf[3] = "abc"; printf("buf:%s\n",buf); }
末尾还有\0,应该设置buf[4]
指针叠加会不断改变指针指向
如下面案例,每次对p++,就修改了指针的指向
void test(){ char *p = (char *)malloc(50); char buf[] = "abcdef"; int n = strlen(buf); int i = 0; for (i = 0; i < n; i++) { *p = buf[i]; p++; //修改原指针指向 } free(p); }
返回局部变量地址
如下面函数,如果返回str,当函数调用完后,系统会释放函数中的临时变量,最终就不能获得str里面的值,正确的应该用实际参数来保存当前字符串变量内容。
char *get_str() { char str[] = "abcdedsgads"; //栈区, printf("[get_str]str = %s\n", str); return str; }
同一块内存释放多次(不可以释放野指针)
void test(){ char *p = NULL; p = (char *)malloc(50); strcpy(p, "abcdef"); if (p != NULL) { //free()函数的功能只是告诉系统 p 指向的内存可以回收了 // 就是说,p 指向的内存使用权交还给系统 //但是,p的值还是原来的值(野指针),p还是指向原来的内存 free(p); } if (p != NULL) { free(p); } }
free()函数的功能只是告诉系统 p 指向的内存可以回收了(p 指向的内存使用权交还给系统),p的值还是原来的值(野指针),p还是指向原来的内存
例如下面程序,释放前后p的指向不变,只是告诉系统,可以回收了,系统去回收。
#include<stdio.h> #include<stdlib.h> #include<string.h> void test() { int *p=NULL; p = (int *)malloc(sizeof(int)); printf("释放前p指向:%d\n",p); free(p); printf("释放后p指向:%d", p); } int main() { test(); return 0; }