c++中int f[100000][100000]为什么报错?

x86平台int的取值范围是:-~,那么打印一下int类型的下界有没有问题呢?

编译器报了一个警告,期待的参数值类型是int,但却给了一个long int,再看下面这个代码:

编译通过? --1 不就等于 -吗?

这是因为c编译器会把-看成由一个符号 - 和 组成的表达式,而已经超出了int类型的取值范围,我们知道32位平台,int,long都是4字节,那么它也超了long的取值范围,由于我电脑是64位系统,long型占8个字节,所以-没有超出long型。第二个代码 - ( <--这是减号)二元操作符左边是-右边是 1 都是int型,它们自己没有超出int型范围,计算结果也是int型,而它的值也没有超出int型范围,所以以%d打印,可以打印出来。

再说一下,通常的编译器实现遵守ILP32或LP64规范

ILP32意思是int(I)、long(L)、指针(P)类型都占32位,4个字节,通常32位计算机的C编译器采用这种规范,x86平台的gcc也是采用这种规范。LP64意思是long(L)、指针(P)占64位,通常64位计算机的C编译器采用这种规范,所以指针类型的长度总是和计算机的位数一致。

c/c++笔试题(3)(转载的)


第2题:考查自加操作(++)

因为i与i-1的最右边的那位(最低位)肯定是不同,如果i1,i-1肯定是0,反之亦然.    i & i-1 这个运算,在二相补的数字系统中,将会消除最右边的1位

答:函数内的sizeof有问题。
根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。
函数外的str是一个静态定义的数组,因此其大小为6,
函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。


  答案:输出:2,5

  而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
  但是prt与(&a+1)类型是不一样的(这点很重要)

9. 请问以下代码有什么问题:

  答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

12. 有以下表达式:

  答案:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险
  博 主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char *)malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针 void getmemory(char

16. 分析下面的程序:

  问输出结果是什么?

  free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.
此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,
尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。
这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。

  当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。

答:变量b定义出错。按默认构造函数定义对象,不需要加括号。

答:首先数组定义有误,应加上类型参数:vector<int>array。其次vector::size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。

答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的:1->2->3->4->5通过反转后成为5->4->3->2->1

最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:

还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。算法的源代码如下:

已知String类定义如下:

我要回帖

更多关于 fread函数的用法 的文章

 

随机推荐