C语言面试题(深度)
16 下面代码的有问题吗?为什么?
#include <stdio.h> void func(char a[10]) {
char c = a[3]; } int main() {
char b[10] = "abcdefg"; func(b[10]); return 0; }
/* * 这里至少有两上严重错误, * 第一,b[10]并不存在,在编译的时候,由于没有去实际地址取值,所以没 有出错。但在运行的时, * 将计算b[10]的实际地址,并且取值。这时候发生越界错误。 * 第二, * warning: * passing argument 1 of 'func' makes pointer from integer without a cast *这是func函数会将传入的char类型的数据当作地址处理,同样会发生错误 。 */
2 下面代码有问题么?为什么?(segment error, 读越界,写越界)
#include <stdio.h> #include <string.h> void foo(void) {
char string[10],str1[10]; int i; for(i=0; i<10; i++) {
str1[i] = 'a'; } strcpy(string,str1); printf("%s",string); } int main() { foo(); return 0; }
代码 2 ,volatile 关键字告诉编译器,i 是随时可能发生的变化的,每次使用 它的时候,必须从内存中取出 i 的值。因而编译器生成的汇编代码会重新从 i 的地址处 读取数据放在 k 中。
代码 2 ,的使用时机,如果 i 是一个寄存器变量,表示一个商品数据或者是多个 线程的共享数据,那么就容易出错,所以说 volatile 可以保证对特殊地址的稳定访 问。
3下面代码,i,j的值分别是什么?为什么?(i为局部静态变量初始化一次, 而j是全局变量,每次都要初始化一次。)
#include <stdio.h> static int j; int k = 0; void fun1() {
static int i = 0; i++; } void fun2() { j = 0; j++; } int main() { for(k=0; k<10; k++) {
1 下面的代码输出什么? 为什么?(补码,类型隐式转换)
#include <stdio.h> void foo(void) {
unsigned int a = 6; int b = -20; (a+b>6)?puts<=6"); } int main() { foo(); return 0; }
19 下面代码有问题吗?为什么?(int getchar())
char c; c = getchar(); if(EOF == c) {
········· }
20 请 编 写 一 个 函 数 , 若 当 前 系 统 为 Big_endian 的 , 则 返 回 0; 若 是 Little_endian的,则返回1。
Example.1 int checksystem() {
union {
int i; char ch; }c; c.i = 1; return (c.ch == 1); }
Example.2 int main() {
int val = 0x12345678; char *p = (char*)&val; printf("%x\n",*p); return 0;
}
fun1(); fun2(); } return 0; }
4.下面代码,假设在32位机系统下,各sizeof计算的结果的分别是多少?
#include<stdio.h> void func(int b[100]) {
printf("%d\n",sizeof(b)); } int main() {
int *p = NULL; printf("%d\n",sizeof(p)); printf("%d\n",sizeof(*p));
test2));
printf("%p\n",&test.a);
printf("%p\n",&test.b);
printf("%p\n",&test.c);
printf("%p\n",&test.d);
return 0;
}
12 写一段代码,向内存 0x12ff7c 地址存入一个整型数 0x100
int main() {
15 下面代码的输出的结果为多少?(逗号表达式)
#include <stdio.h> int main() {
/*a[3][2]={1,3,5,0,0,0}*/ int a[3][2] = {(0,1),(2,3),(4,5)}; int *p; p = a[0]; printf("%d",p[0]); return 0; }
8 在32位的X86系统下,输出的值为多少?
#include <stdio.h> int main() {
int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)(&a + 1); int *ptr2 = (int *)((int)a + 1); printf("%d, %x",ptr1[-1], *ptr2);
5下面代码结果是多少,为什么?(255)
#include <stdio.h> #include <string.h> int main() {
char a[1000]; int i; for(i=0; i<1000; i++) {
a[i] = -1 -i; } printf("%d\n",strlen(a)); return 0; }
17 下面代码有问题吗?为什么?
#include <stdlib.h> #include <string.h> struct student {
char *name; int score; }stu,*pstu; int main() { pstu = (struct student *)(malloc(sizeof(stu))); strcpy(pstu->name,"jimmy"); pstu->score = 99; free(pstu); return 0; }
6下面代码里的内容哪些可以改变,哪些不可以改变?
const int *p; int const *p;
int *const p;
const int *const p;
7下面的两段代吗?有什么区别?什么时候需要使用代码2?
1 int i = 10; int j = i; int k = i;
2 volatile int i = 10; int j = i; int k = i;
11 请说出两个结构体所占内存的大小。(内存对齐原则)
#include <stdio.h>
struct test1
struct test2
{
{
char a;
char a;
short b;
char b;
char c;
short c;
int d;
int d;
}test;
};
int main()
{
printf("%d %d\n",sizeof(struct test1),sizeof(struct
int *p = (int*)0x12ff7c; *p = 0x100; /* * *(int *)0x12ff7c = 0x100 */ return 0; }
13. 下面代码的值为多少?(2,5)
#include <stdio.h> int main() {
int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a + 1); printf("%d,%d", *(a+1),*(ptr-1)); return 0; }
int a[100]; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a[100])); printf("%d\n",sizeof(&a)); //求一个整型地址的地址 printf("%d\n",sizeof(&a[0]));
int b[100]; func(b); return 0; }
//注意从高字节开始打印
return 0; }
9 printf("%d",0x01<<2+3);
warning: suggest parentheses around '+' inside '<<'
10 定义一个宏函数就 x 的平方?
#define SQR(x) ((x)(x))
注释:该语句有缺陷,如果传入,++a 这样的内容则会使宏函数失效。
14 假设p的值为0x100000 ,如下表达式的值分别为多少?