和黛玉学编程..........>
这篇的代码对应知识点就在上一篇啦
常见的动态内存的错误
对NULL指针的解引用操作
void test() { int *p = (int *)malloc(INT_MAX/4); *p = 20; free(p); }
如果P的值是空指针就会有问题,所以一般都会先进行判断
对动态开辟空间的越界访问
void test() { int i = 0; int *p = (int *)malloc(10*sizeof(int)); if(NULL == p) { exit(EXIT_FAILURE); } for(i=0; i<=10; i++) { *(p+i) = i; } free(p); }
当i是10的时候就会越界访问
对非动态开辟内存使用free释放
void test() { int a = 10; int *p = &a; free(p); }
之前我们已经说过 free函数的时候,是对动态内存使用,所以这个就是错误的
使用free释放⼀块动态开辟内存的一部分
void test() { int *p = (int *)malloc(100); p++; free(p);
free使用的时候,指向的位置必须是对应的首地址,这里P已经变化了,所以是不行的哦
对同⼀块动态内存多次释放、
void test() { int *p = (int *)malloc(100); free(p); free(p); }
动态开辟内存忘记释放(内存泄漏)
void test() { int *p = (int *)malloc(100); if(NULL != p) { *p = 20; } } int main() { test(); while(1); }
这里就是忘记使用了free
动态内存经典笔试题
1.
void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); }
我们来看结果
为什么呢?
这个就涉及到了函数栈祯的销毁,对于
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
下面的str根本没有影响,还是空指针,这个只是形参实参区别而已,它执行了这个代码以后就没有以后了
2、
char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); }
我们看结果
我们return p以后,str就是首元素地址,但是GetMemory里面的数组在出来以后就不能使用了
你就算传首元素地址也没有用,你使用不了 ,
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
使用完以后P就是野指针了
3.
void GetMemory(char **p, int num) { *p = (char *)malloc(num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); printf(str); free(str); }
这个就是正常打印hello啦
QWQ,希望对你有帮助!