- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1. 请问以下代码有什么问题:
int main()
{
char a;
char *str=a;
strcpy(str,”hello”);
printf(str);
return 0;
}
答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
2,请问以下代码有什么问题?
#includestdio.h
#includestdlib.h
#includestring.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;
}
分析:str是一个字符指针,这个指针指向NULL,函数getmemory(char *)这个函数调用时,系统会给他申请一个临时指针变量,函数调用结束又不会释放这个指针变量,所以把malloc申请的内存空间赋给这个指针是不会成功的,因为函数调用结束就会释放掉p,p指针存储的地址也就无从知道。
当把str = NULL赋值给形参变量没意义,p又接受了malloc申请的地址。
3,(第一次遇到这样的题目)
要对绝对地址0×100000赋值,我们可以用(unsigned int*)0×100000 = 1234;
那么要是想让程序跳转到绝对地址是0×100000去执行,应该怎么做?
答案:*((void (*)( ))0×100000 ) ( );
首先要将0×100000强制转换成函数指针,即:
(void (*)())0×100000
然后再调用它:
*((void (*)())0×100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0×100000)();
4,分析下面这个程序
(下面的程序我只喜欢两句话:
①,free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.
②,尽管这段程序确实是存在大大的问题但是通常会打印出world来,这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。
)
void GetMemory(char **p,int num)
{ //p,指向指针的指针,*p,p指向的指针(即str),**p,最终的对象,str指向的单元
*p=(char *)malloc(num); //申请空间首地址付给传入的被p指向的指针,即str
}
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一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存 前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。
5,char a[10];
strlen(a)为什么等于15?
其实strlen(a)的值是不确定的,因为strlen是以\0作为结束符,所以不确定
6, 一语句实现x是否为2的若干次幂的判断
int i = 512;
cout boolalpha ((i (i - 1)) ? false : true) endl;(我认为这段
文档评论(0)