- .#include <stdio.h>
- #include <stdlib.h>
- void getmemory(char *p)
- {
- p=(char *) malloc(100);
- strcpy(p,"hello world");
- }
- int main( )
- {
- char *str=NULL;
- getmemory(str);
- printf("%s/n",str);
- free(str);
- return 0;
- }
- 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险
- unsigned short A = 10;
- printf("~A = %u/n", ~A);
- char c=128;
- printf("c=%d/n",c);
- 输出多少?并分析过程
- 第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285
- 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。
- 这两道题都是在考察二进制向int或uint转换时的最高位处理。
- 分析下面的程序:
- void GetMemory(char **p,int num)
- {
- *p=(char *)malloc(num);
- }
- int main()
- {
- char *str=NULL;
- GetMemory(&str,100);
- strcpy(str,"hello");
- free(str);
- if(str!=NULL)
- {
- strcpy(str,"world");
- }
- printf("/n str is %s",str);
- getchar();
- }
- 问输出结果是什么?希望大家能说说原因,先谢谢了
- 输出str is world。
- free 只是释放的str指向的内存空间,它本身的值还是存在的.
- 所以free之后,有一个好的习惯就是将str=NULL.
- 此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,
- 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。
- 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
- 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。