C语言面试题笔记

  1. 解释 char *const*(*next)();
    定义了函数指针next,next指向了一个无参且返回值为一个指向一个常量指针的字符型指针的函数。

  2. 解释 char* (*c[10])(int **p);
    定义了函数指针数组c,c中的元素是指向参数为int型二级指针且返回值为字符型指针的函数的函数指针。

  3. 以下代码的问题

    char*s = "AAA";
    printf("%s",s);
    s[0] = 'B';
    printf("%s",s);
    

    "AAA"为只读的字符串常量,修改它会引发段错误

  4. 要求将绝对地址0x40020800的内容设置为整形数0x3456

    *(unsigned int*)0x40020800 = 0x3456;
    
  5. 以下两种情况的意图都是要定义dps和tps作为结构体指针指向s,那种方式更好?

    #define dps struct s*
    typedef struct s* tps; 	
    

    使用#define定义两个指针时,dps p1,p2在预编译时被替换成 struct s* p1,p2,只有p1被定义成了结构体指针,而使用typedef不会出现这种情况。所以此时使用typedef来定义更好。

  6. 以下代码有什么问题?该如何修改?

    #include <stdio.h>
    char* gett_str(void);
    int main(){
    	char* p = get_str();
    	printf("%s\n",p);
    	return 0;
    }
    char* gett_str(void){
    	char str[] = {a,b,c,d};
    	return str;
    }
    

    函数get_str()在调用结束后在栈区的空间即被释放,之后对局部变量str的访问便没有意义。可以在str[]前加关键字static将字符数组存放在静态区。

  7. 下面代码的运行结果是什么?

    #inclde <stdio.h>
    int main(){
    	unsigned int a = 6;
    	int b = -20;
    	a+b > 6 ? printf(">6") : printf("<=6");
    	return 0;
    }
    

    无符号整数与有符号整数相加时有符号整数转换为无符号整数再相加。a+b=6+20>6,打印“>6”

  8. 什么是大端模式?什么是小端模式?编写代码测试你计算机是大端模式还是小端模式。
    大端模式:数据的低位存放在内存的高地址,数据的高位存放在内存的低地址。
    小端模式:数据的低位存放在内存的低地址,数据的高位存放在内存的高地址。

    #include<stdio.h>
    int main(){
    	int i;
    	union Test{
    			unsigned int n;
    			char arr[4];
    	}
    	union Test t;
    	t.n = 0x12345678;
    	for(i=0;i<4;i++)
    		printf("&arr[%d]=%p,arr[%d]=0x%#x\n",i,&t.arr[i],i,t.arr[i]);
    }
    
  9. 想取出当前计算机系统下无符号整数int型的最小值和最大值,评价下面代码片段

    unsigned int zero = 0;
    unsigned int compzero = 0xFFFF;
    

    int型数据的位数由系统环境决定,第二行改成unsigned int compzero = ~0

  10. 下面代码的作用是在数组中查找特定的元素,若将&&换成&是否仍能实现功能

    i = 0while(i<arrsize && arr[i]!=x)
    	i++;
    

    当i = arrsize时,i<arrsize为0,逻辑与后的arr[i]!=x不会执行。若将&&换为&,arr[i]!=x会和0进行按位与计算,发生了数组越界,可能产生不合法的访问。

  11. 下面的程序会输出什么?

    #include<stdio,h>
    int main(){
    	int i = 43;
    	printf("%d",printf("%d",printf("%d",i)));
    	return 0;
    }
    

    printf()函数的返回值为输出字符的个数,故屏幕打印 4321

  12. 下面的代码有什么问题?

    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(strlen(p1);
    strcpy(p2,p1);
    

    strlen函数计算字符串大小时并不包括’\0’,所以p2开辟的空间少了一个字节,拷贝字符串时会发生越界。

  13. 用字符数组和指针定义的字符串有什么不同?
    字符数组的数组名为一常量指针,不能被修改;字符指针可以随意更改指向其它的字符串。

  14. 解释宏#define offsetof(TYPE,MEMBER) ((size_t) &((TYPE*)0)->MEMBER) 的含义
    该宏可得出成员MEMBER在TYPE中的偏移量

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

money的大雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值