面试题训练
void test1()
{
char string[10];
char* str1 ="0123456789";
strcpy( string, str1 );
}
这段程序的问题:1.我出现的问题,发现string【10】数组是可以不用初始化在使用的。
2.主要的问题是数组越界,在str1指针指向的字符串中结尾处隐藏了“\0”这个字节所以造成了string数组放不下也就是数组越界。
void test2()
{
char string[10],str1[10];
int i;
for(i=0; i<10; i++)
{
str1 ='a';
}
strcpy( string, str1 );
}
修改:
void test2()
{
char string[10],str1[10];
int i;
for(i=0;i<9;i++)
{
str1[i] = 'a';
}
str1[9] = '\0';
strcpy(string,str1);
}
注意的问题:1.编译时报错,str1数组的赋值不是这样的。
2.数组越界的问题。
3.strcpy(string,str1)函数的作用:把str1的所有字符都复制到string里面去。
void test3(char* str1)
{
if(str1 == NULL){
return ;
}
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
修改:
void test3(char* str1)
{
char string[10];
if(str1 == NULL)
{
return ;
}
if(strlen(str1)+1<=10)
{
strcpy(string,str1);
}
}
注意的问题:1.c语音中定义变量或数组放置在函数最前面。
2.strlen函数在计算字符串的个数时没有把’\0’字符算在内。而strcpy函数是把str1中的所有字符都给到string数组中,所有容易造成数组越界。
写出strcpy()完整的函数:
char* strcpy(char *strDest,const char *strSrc)
{
assert(strDest != NULL,strSrc != NULL);//断言,看参数是否为空。
char *address =strDest;
while((*strDest++ = *strSrc++) != '\0');
*address = '\0';
return address;
}
** 局部变量能否和全局变量重名 **
能,局部变量会屏蔽全局。要用全局,需要使用“::”。而“::”不适用c编译器,适用于c++编译器。
** 如何引用一个已经定义过的全局变量**
1.extern
2.引用头文件的方式。
** 全局变量可不可以定义在被多个.C文件包含的头文件中**
可以,在多个.C文件中使用static形式来声明同名全局变量。
** static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?**
答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,
在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
2) 从以上分析可以看出,
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
3)
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
10、请找出下面代码中的所有错误 (题目不错,值得一看)
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
#include"string.h"
main()
{
char *src="hello,world";
char *dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
return 0;
}
修改:
#include"string.h"
main()
{
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len+1);//???
char* d=dest;
char* s=&src[len-1];//???
while(len--!=0)
*d++=*s--;//???
*d = '\0';//????
printf("%s",dest);
free(dest);//????
dest = NULL;//????
return 0;
}
问题:
1.src实际上有12个字符。而len为11,动态内存申请时要申请12个字节。
2.s为指针变量,所以把字符串的最后一个字节的地址赋值给它。
3.把指针s中的值赋值给d而不是把地址。
4.在最后的一个空间手动赋值为‘\0’.
5.因为前面申请了动态内存,所以在最后要记得释放空间。而且因为dest初始化为空指针,如果最后不手动赋值dest=NULL,就会使得dest成为野指针,这个是很可怕的,野指针是不知道指向什么地址,所以里面的数据是垃圾数据,会对程序造成重大的影响。空指针实际上就是使野指针合法化的一种形式。