第一题:
下面程序的输出结果?
#include <stdio.h>
#include <iostream>
void main()
{
char str1[] = "";
char str2[] = "";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
char* str7="abc";
char* str8="abc";
std::cout << std::boolalpha << ( str1==str2 ) << std::endl; // 输出什么?
std::cout << std::boolalpha << ( str3==str4 ) << std::endl; // 输出什么?
std::cout << std::boolalpha << ( str5==str6 ) << std::endl; // 输出什么?
std::cout << std::boolalpha << ( str7==str8 ) << std::endl; // 输出什么?
int i;
scanf("%d",&i);
}
结果:false,false,true,true. 因为前两个的内存是在heap上分配的,当然是不同的地址;而后两个是在静态区分配的,后面的先检查前面有无该字符串,有的话,就不再分配,所以str5,str6,str7,str8地址都是相同的。
第二题:
1.检查下面程序是否有错误并写出运行结果
(1).
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
(2).
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
(3).
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory2(&str, 100);
strcpy(str, "hello");
printf(str);
}
结果:(1)程序崩溃。因为str并未被赋值,仍然是0;
(2)可能是乱码。因为"hello world"过了生命期,不在内存了。
(3)显示"hello"正确,但是有内存泄露。
第三题:
已经链表结构如下,请写出倒链函数?
struct NodeLink
{
int data;
NodeLink* next;
};
NodeLink* DaoLian(NodeLink* head)
{
};
结果:
NodeLink* DaoLian(NodeLink* head)
{
NodeLink* temp=head->next;
NodeLink* temp2=NULL;
head->next=NULL;
while(temp->next!=NULL)
{
temp2=temp->next;
temp->next=head;
head=temp;
temp=temp2;
}
temp->next=head;
return temp;
}
第四题:
已知String的定义如下,请写入实现函数:
class String
{
public:
String(const char* str=NULL);
String(const String &another);
String & operator =(const String &rhs);
~String();
private:
char* m_data;
};
结果:
String::String(const char* str)
{
if(NULL==str)
{
m_data=new char[1];
m_data[0]='/0';
}
else
{
m_data=new char[strlen(str)+1];
strcpy(m_data,str);
}
};
String::String(const String &another)
{
m_data=new char[strlen(another.m_data)+1];
strcpy(m_data,another.m_data);
}
String::~String()
{
delete[] m_data;
}
第四题:
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
结果:
1.
int fun(int n)
{
int result=0;
for(int i=1;i<=n;i++);
{
result=restult+i;
}
return result;
}
2.int fun(int n);
{
return (1+n)*n/2;
}
显然2的效率要高很多,要善于在程序中运用数学知识。
第五题:
以下程序的输出结果?
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 。(考察数据在内存中的储存位置。数据从低地址(0X0000 0000)开始存。低位低地址,高位高地址。)
第六题:
11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。
答案:
第七题:
写一个函数实现以下功能:在一个二维数组中,随机分布着数字0 或者1。给定一个坐标点(x,y),将所有与其相邻(只判断上下左右)的并且值等于这个点的点,及其邻点相邻的点的值变为0.即所有与(x,y)有直接相邻及间接相邻的点均置0.假设数组宽及高分别为W,H.
第八题:
写一个内存管理类。此类的职责为避免频繁的new和delete,使分配的内存能够进行复用,即所谓内存缓冲池。
在类初始化时申请一块大的内存,当外界需要内存时从此大的内存块中取出没有用的内存交给外界使用,
当外界使用完后归还此内存,并留给后续的线程使用。为了方便一点规定每次使用的内存块大小为5K(有能力者可以选择获取不固定内存),需要考虑线程安全问题.
第九题(考察字符串的结尾符):
#include "stdio.h"
void main()
{
printf("abcd");//打印正常
printf("/n");
char c1[]={'a','b','c','d'};//char数组没有结尾符,打印不正常
printf(c1);
printf("/n");
char c2[]={'a','b','c','d','/0'};//char数组有结尾符,打印正常
printf(c2);
printf("/n");
}
第十题(指针的指针):
#include "stdio.h"
void main()
{
static char *name[]={"follow me","BASIC","Great Wall","Fortran","Computer design"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s/n",*p);//printf("%s")表示打印字符串,如果字符串有/0,则不打印后面的字符。
}
scanf("%d",&i);
}
第十一题(基础)
s1 s2的值是多少?考察break和continue的区别。
第十二题(基础题)
c的值是多少?(考察前自加和后自加;入栈顺序)
第十三题
字节对齐
#pragma pack(4)
可以用来考察类的大小
第十四题
strlen函数是用来测量字符串大小的,不是字符串的会返回一个随意值。
char str1[4];//str1[4]不是字符串
char str2[4]={'a','b','c','\0'};//str2是字符串
char str3[4]={'a','b','c','0'}//str3不是字符串,是字符数组
char str4[4]={'a','b','c',0};//str4是字符串
char str5="";
char str6="a";//str5,str6都是字符串
第十五题
strcpy会把字符串的结尾符拷过去;memcpy不会。
第十六题
烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
是debug中未初始化的栈变量
屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯
是debug中未初始化的堆变量
debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来
第十七题
lib和dll的区别,到底二进制代码放在了哪个文件里面