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返回指向“栈内存”的指针。
- char* GetString(void)
{char *p = "hello"; return p;}
void Test(void)
{char* str = NULL; str = GetString();}
运行无错,因为"hello"是常量,存放在代码段,进程运行时都有效,所以返回的p是固定值,而上面的数组则是将"hello"从代码段拷贝到栈内存进行初始化,函数返回是数组的地址,并不是代码段的地址,所以函数结束后,栈内存中的数组数据被释放了,返回的东西是栈上的东西,只不过hello被覆盖掉了。这类题目百分百会考,只是改变形式而已。
- 内存存放:
代码段:程序代码。
静态区:全局变量,static变量。
动态区(栈区):局部变量,自动申请释放。
动态区(堆区):malloc,用户手动申请释放。
常量区:const 修饰的变量。