当前位置:   article > 正文

c语言内存开辟常见错误_printf(str)错误

printf(str)错误

例一:无法获得开辟好的内存

  1. void GetMemory(char *p)
  2. {
  3. p = (char *)malloc(100);
  4. }
  5. void Test(void)
  6. {
  7. char *str = NULL;
  8. GetMemory(str);
  9. strcpy(str, "hello world");
  10. printf(str);
  11. }

这是一个常见的错误:调用了GetMemoy把str所指向那个null当作形参给这个函数,函数开辟了100字节空间给p,但是这里的p是形参(形参是实参的临时拷贝,str和p指向的是完全不同的空间,出了GetMemoy这个函数,p就会被销毁)没有办法拿到动态开辟的内存的地址,所以出了这个函数p就不存在,但是开辟的内存依然存在,这会导致开辟的内存无法释放,导致内存泄漏。再调用strcpy,把hello word拷贝到str所指向的空字符串中必然会出错!!!

改造一下就ok了

方法一:

  1. void GetMemory(char** p)
  2. {
  3. *p = (char*)malloc(100);
  4. }
  5. void Test(void)
  6. {
  7. char* str = NULL;
  8. GetMemory(&str);//把str的地址传过去,使其改变地址指向的内容
  9. strcpy(str, "hello world");
  10. printf(str);
  11. }

把str的地址取出来给GetMemoy函数,使得改变str的指向,这样出了Getmemoy这个函数,str也能指向动态开辟的内存,这样一来就可把字符串拷贝到str了 

方法二:

  1. char* GetMemory()
  2. {
  3. char *p=(char*)malloc(100);
  4. if (p==NULL) {
  5. perror("");
  6. }
  7. else
  8. {
  9. return p;
  10. }
  11. }
  12. void Test(void)
  13. {
  14. char* str = NULL;
  15. str=GetMemory();
  16. strcpy(str, "hello world");
  17. printf(str);
  18. }

把开辟好的空间返回来赋给str也是可以的!!

例二:对动态内存的越界访问

这里开辟了16字节内存,每一个int*的访问的地址是4个字节,而i等于5时就已经访问了20个字节了,超出了开辟的16字节,所以报错!!!

例三:对非动态内存的free释放 

这里的p不是动态开辟的内存,不可以free释放!! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/347422
推荐阅读
  

闽ICP备14008679号