1:请问以下代码是否出现错误,会有什么结果呢?
#include<stdio.h>
void GetMemory(char* p)
{p = (char*)malloc(100);//p申请了100个字节的空间
}
void Test(void)
{char* str = NULL;//str是空指针GetMemory(str);//返回之后str还是空指针。strcpy(str,"hello world");//将字符拷贝到str里面。printf(str);
}
int main()
{Test();return 0;}
以上的代码问题:应为返回之后str还是空指针。
1.对NULL的指针进行解引用操作,程序会崩溃 。
2.造成内存泄漏。
所以可以进行修改:
#include<stdio.h>
void GetMemory(char* p)
{p = (char*)malloc(100);//p申请了100个字节的空间return p;
}
void Test(void)
{char* str = NULL;//str是空指针str = GetMemory();//返回之后str还是空指针。strcpy(str,"hello world");//将字符拷贝到str里面。printf(str);free(str);str = NULL;
}
int main()
{Test();return 0;}
2:请问以下代码是否出现错误,会有什么结果呢?
以下是典型返回栈空间地址的问题。
#include<stdio.h>
char* GetMemory(void)
{char p[] = "hello world";//创建的局部的数组return p;//返回数组名,就是返回起始地址。
}
void Test(void)
{char* str = NULL;//创建指针变量,str置为空 str = GetMemory();//str接收 printf(str);
}
int main()
{Test();return 0;}
以上在调用函数的时候返回的是p的起始地址
1,返回之后,出作用域就被销毁,这个空间就不属于我了。放回str里面。
2,str一旦接受就变成野指针了。因为地址指向的空间已经不属于当前空间了。
3,返回变量可以,但是返回地址不行,返回栈空间的地址
例如:以下这种代码是 有问题的,不正确的
int *f1(void)
{int x=10;return(&x);//不对
}
int *f2(void)
{int *ptr;//ptr没有初始化,所以就是野指针 *ptr = 10;return ptr;
}
3:请问以下代码是否出现错误,会有什么结果呢?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p,int num)
{*p = (char*)malloc(num);//开辟num个字节的空间} void Test(void){char* str = NULL;GetMemory(&str,100);//调用函数申请100个字节strcpy(str,"hello");//将hello拷贝给strprintf(str);//最后将str打印出来}int main(){Test();return 0;}
以上的代码会出现内存泄漏,因为打印后str并没有释放。
应该在printf(str)后面加上代码:free(str) ; str=NULL;
4:请问以下代码是否出现错误,会有什么结果呢?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>void Test(void){char* str = (char*)malloc(100);strcpy(str,"hello");free(str);if(str != NULL){strcpy(str,"world");printf(str);}}int main(){Test();return 0;}
当释放str的时候,str指为空,if里的条件一定为真。释放后没有指为空,此时str为野指针。
把str指向的空间还给操作系统,无法再继续使用。