1.先尝代码:
char *p; 野指针 造成非法内存访问 ,会出现段错误,cmd窗口闪退
p = (char *)malloc(128); 申请空间malloc
if(p == NULL){ 一旦用了malloc,一定要注意内存泄漏的问题。malloc可能会失败,要对返回值做判断
printf("申请内存失败\n");
exit(-1); -1代表是程序是非正常退出
}
memset(p,'\0',128); 给指针p初始化。用了直接初始化,另一种就是用memset(),优点在于灵活多变
printf("输入你想要的字符串:\n");
gets(p); API之获取键盘输入的字符串
puts(p); 输出字符串,自带自动换行
2.代码解析_指针的另一种初始化用memset()函数:
- memset()第一个参数:初始化对象
- memset()第一个参数:初始化成什么字符
- memset()第一个参数:初始化多大
3.memset()中的第三个参数,不可以用sizeof(注意这些细节);
因为指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关。譬如以前是16为地址,指针即为2个字节,现在一般是32位系统,所以是4个字节,以后64位,则就为8个字节。(一般就记住:指针在windows是4个字节,linux是8位字节,一个字节是8位)
char *p;
p = (char *)malloc(128); malloc了一个128位的空间,并且强转为char型后,相当于一个数组,char[128]
并且让指针p指向这个开辟的char型的空间
正确:memset(p,'\0',128);
错误:memset(p,'\0',sizeof(p)/sizeof(p[0]));
这里的sizeof(p)/sizeof(p[0]) = 4个字节,sizeof(p) = 4个字节;
因为无论实际给指针p指向的空间malloc了多大,指针本身就是4个字(在windows中)