- #include<iostream>
- #define N 10
- using namespace std;
- int main()
- {
- int a[N],front,end,x,mid,i;
- cout<<"enter number: "<<endl;
- for(i=0;i<10;i++)
- cin>>a[i];
- cout<<"shu ru yao cha zhao shu x= "<<endl;
- cin>>x;
- front=0;
- end=N-1;
- mid=(front+end)/2;
- while(front<end && a[mid]!=x)
- {
- if(a[mid]<x) front=mid+1;
- if(a[mid]>x) front=mid-1;
- mid=(front+end)/2;
- }
- if(a[mid]!=x)
- cout<<"can not find x"<<endl;
- else
- cout<<"find it"<<mid+1<<endl;
- return 0;
- }
字符串拷贝:
版本v1:src源地址,dest目的地址
返回拷贝好的地址;如果重叠或者出错,无定义
异常:可能出现字符串溢出,及dest所占空间不如src所占空间大。
char *strcpy(char *dest,const char *src)
{
assert((dest!=NULL)&&(src!=NULL));
char *to=dest;
while((*dest++=*src++)!='\0')
{
NULL;
}
return to;
}
char *strcpy(char *dest,const char *src)
{
char *d=dest;
char c;
while(*src)
*dest++=*src++;
*dest='\0';
return d;
}
strlen函数实现代码:
int strlen_a(const char *src){
int length=0;
while(*str++)
++length;
return length;
}
char *strcat(char *s,const char *append)
{
char *save=s;//保存s的首地址到指针save中
for(;*s;*s++);//将s所指向的字符串首指针移到串尾处
while((*s++=*append++)!='\0');
return save;
}
int strcmp ( const char* src, const char* dst )
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
int checkcpu()
{
{
union w{int a;
char b;}c;
c.a=1;
return (c.b==1);
}
}
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解.采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节.例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
存放内容
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
存放内容
0x12
0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78
联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写.如果谁能当场给出这个解答,那简直就是一个天才的程序员.
2.
char str[] = “Hello” ;
char *p = str ;
int n = 10;
请计算
sizeof (str ) = 6 (2分)
sizeof ( p ) = 4 (2分)
sizeof ( n ) = 4 (2分)
void Func ( char str[100])
{
请计算
sizeof( str ) = 4 (2分)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = 4 (2分)
3、在C++程序中调用被 C编译器编译后的函数,为什么要加 extern “C”? (5分)
答:C++语言支持函数重载,C语言不支持函数重载.函数被C++编译后在库中的名字与C语言的不同.假设某个函数的原型为: void foo(int x, int y);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字.
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题.
4.有关内存的思考题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:程序崩溃.
因为GetMemory并不能传递动态内存,
Test函数中的 str一直都是 NULL.
strcpy(str, "hello world");将使程序崩溃.
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:可能是乱码.
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险.
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用.