中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
总之,static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
2、程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于( )中。 答案:栈;静态区;堆
// C/C++程序编译后的内存分为五部分:堆区、栈区、全局区(静态区)、常量区和代码区。
3、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;} too; DATE max;
则语句 printf(\的执行结果是:______ (sizeof()函数的用法)
答案:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节,所以它的大小是20,data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52。当然,在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
4、队列和栈有什么区别?
答案:队列先进先出,栈后进先出
6、已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。 答案:
slnodetype *Delete(slnodetype *Head, int key) if(Head->number==key)
{ Head=Pointer->next; free(Pointer); break; } Back = Pointer; Pointer=Pointer->next; if(Pointer->number==key)
{ Back->next=Pointer->next; free(Pointer); break; } void delete(Node* p) { if(Head = Node)
while(p) }
7、请找出下面代码中的所有错误,说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#include\
2、main() 3、{
4、 char*src=\5、 char* dest=NULL; 6、 int len=strlen(src); 7、 dest=(char*)malloc(len); 8、 char* d=dest; 9、 char* s=src[len]; 10、 while(len--!=0) 11、 d++=s--;
12、 printf(\13、 return 0; 14、}
答案:还要加上#include
int main()
{ char* src = \int len = strlen(src);
char* dest = (char*)malloc((len+1)*sizeof(char)); //要为\\0分配一个空间 char* d = dest;
char* s = &src[len-1]; //指向最后一个字符 while( len-- != 0 ) *d++=*s--;
*d = 0; //尾部要加\\0 printf(\
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 return 0; }
华为笔试题(3)
一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分) 1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( 正确 ) 2、int (*ptr) (),则ptr是一维数组的名字。( 错误 int (*ptr) ();定义一个指向函数的指针变量 )
3、指针在任何情况下都可进行>, <,>=, <=,==运算。( 错误 )
4、switch(c) 语句中c可以是int ,long,char ,float ,unsigned int 类型。( 错,不能用实形 ) 二、填空题(共30分)
1、在windows下,写出运行结果, char str[ ]= "Hello"; char *p=str; int n=10;
sizeof(str)=( ) sizeof(p)=( ) sizeof(n)=( ) void func(char str[100]){ } sizeof(str)=( )
答案:6,4,4,4, 具体解释请参看我的空间里的“C/C++程序员应聘试题剖析”
2、void getmemory(char **p, int num) { *p=(char *) malloc(num);} void test(void) { char *str=NULL; getmemory(&str,100); strcpy(str,"hello"); printf(str); }
运行test函数有什么结果?
答案:输出hello,但是发生内存泄漏。 3、设int arr[]={6,7,8,9,10};
int *ptr=arr; *(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
答案:8, 8。这道题目的意义不大,因为在不同的编译器里printf的参数的方向是不一样的,在vc6.0下是从右到左,这里先*(++ptr) 后*pt,于是结果为8,8
三、编程题(第一小题20,第二小题30分)
1、 不使用库函数,编写函数int strcmp(char *source, char *dest),相等返回0,不等返回-1; 答案:一、
int strcmp(char *source, char *dest) { assert((source!=NULL)&&(dest!=NULL));
int i,j;
for(i=0; source==dest; i++)
{ if(source=='\\0' && dest=='\\0') return 0; else return -1;