博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言面试笔试整理笔记(二)
阅读量:6975 次
发布时间:2019-06-27

本文共 1308 字,大约阅读时间需要 4 分钟。

  • void* p = malloc(100);

    sizeof(p) = 4;指针的字节数,并非指向内容的大小。

  • void Func(char str[100])

    sizeof(str) = 4;数组作为函数的参数进行传递时,该数组自动退化成同类型的指针。

  • void GetMemory(char* p, int num)

    {p = (char*)malloc(sizeof(char)*num);}

    void Test(void)

    {char* str  = NULL; GetMemory(str,100); strcpy(str,"hello");}

    错误出现在GetMemory函数中,p为形参,数据被容存放在栈空间,函数调用结束后自动被释放,所以malloc申请的内存返回的头指针不会返回给str,故Test()中的str还是NULL,因此strcpy()运行错误。每次调用GetMemory函数都会产生一块内内存的泄漏。

  • 理想更改方案:1.malloc函数返回值必须判断。2.申请的内存必须手动free释放。3.free后的地址必须重新复制NULL。

    void GetMemory(char** p, int num)

    {*p = (char*)malloc(sizeof(char)*num);

    if(*p == NULL) printf("error\n");}//返回值判断必须做。

    void Test(void)

    {char* str = NULL; GetMemory(&str, 100); strcpy(str,"hello");

    free(str); str = NULL;}  //这两部非常重要。

  • char* GetString(void)

    {char p[] = "hello"; return p;} //编译器将提出警告。

    void Test(void)

    {char* str = NULL; str = GetString();}//str 的内容是垃圾

    不能用return返回指向“栈内存”的指针。

      1. char* GetString(void)

    {char *p = "hello"; return p;}

    void Test(void)

    {char* str = NULL; str = GetString();}

    运行无错,因为"hello"是常量,存放在代码段,进程运行时都有效,所以返回的p是固定值,而上面的数组则是将"hello"从代码段拷贝到栈内存进行初始化,函数返回是数组的地址,并不是代码段的地址,所以函数结束后,栈内存中的数组数据被释放了,返回的东西是栈上的东西,只不过hello被覆盖掉了。这类题目百分百会考,只是改变形式而已。   

  • 内存存放:

    代码段:程序代码。

    静态区:全局变量,static变量。

    动态区(栈区):局部变量,自动申请释放。

    动态区(堆区):malloc,用户手动申请释放。

    常量区:const 修饰的变量。

   

转载于:https://www.cnblogs.com/chenxukai/archive/2012/10/08/2714936.html

你可能感兴趣的文章
同时使用python2和Python3
查看>>
已结采购订单不显示
查看>>
hdu 4941 2014 Multi-University Training Contest 7 1007
查看>>
解决windows下的mysql匿名登陆无法使用mysql数据库的问题(转载)
查看>>
jQuery常见的几个文档处理方式
查看>>
windows10+ubuntu16.04双系统搭建
查看>>
js控制文本框只能输入整数或浮点数
查看>>
css清除浮动
查看>>
SiteMesh在项目中的配置
查看>>
从excel中读取用户数据发送email
查看>>
LeetCode - Refresh - Path Sum II
查看>>
XJOI网上同步训练DAY1 T1
查看>>
selected_related和prefetch_related
查看>>
Java Web项目中解决中文乱码方法总结
查看>>
Java路程
查看>>
docker network基础
查看>>
Android蓝牙栈bluez使用方法
查看>>
软件安装
查看>>
go for select
查看>>
关于DOM的一些基础问题
查看>>