C语言面试笔试整理笔记(二)

  • 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 修饰的变量。

   

posted @ 2012-10-08 11:13  Second Life  阅读(325)  评论(0编辑  收藏  举报