C语言面试题(一)

1、以下为Linux下的32 位C 程序,请计算sizeof 的值。
char str[] = “Hello” ;
char *p = str ;
int n = 10;
int a2[3];
请计算
(1)sizeof (str) =
(2)sizeof (p) =
(3)sizeof (n) =
(4)sizeof (a2) =
【答案】

(1)6、(2)4 、(3 )4 (4) 12

64位系统上答案:6/8/4/12。

  1. sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
  2. sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小。
    3)数组的sizeof值等于数组所占用的内存字节数。
    4)在32位计算机中,一个指针变量的返回值通常是4(注意结果是以字节为单位),在64位系统中指针变量的sizeof通常为8。

参考 C程序设计语言(第2版·C语言之父着)

2、void Func ( char str[100])
{
…… ;
}
请计算sizeof( str ) =
【答案】4
这里str是指针。

3、void * p = malloc(100);
请计算sizeof (p) =
【答案】4

4、请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
【答案】
没有为str分配内存空间,将会发生异常。
问题出在将一个字符串复制进一个字符变量指针所指
地址。虽然可以正确输出结果,但因为越界进行内在
读写而导致程序崩溃。

5、struct name1{
char str;
short x;
int num;
} ;
求sizeof(name1)?
【答案】8

6、struct name2{
char str;
int num;
short x;
};
求sizeof(name2)?
【答案】12

7、关键字volatile有什么含意? 并给出三个不同的例
子。
【参考答案】一个定义为volatile的变量是说这变量可
能会被意想不到地改变,这样,编译器就不会去假设
这个变量的值了。精确地说就是,优化器在用到这个
变量时必须每次都小心地重新读取这个变量的值,而
不是使用保存在寄存器里的备份。下面是volatile变量
的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量
(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

8、Heap与stack的差别。
【标准答案】Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空
间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C 中的malloc 函数分配的内存空间即在堆上,C++中对
应的是new 操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且
程序运行过程中函数调用时参数的传递也在栈上进行。

9、程序的局部变量存在于___ 中,全局变量存在于
_中,动态申请数据存在于 中。
【标准答案】程序的局部变量存在于栈(stack) 中,全局
变量存在于静态数据区中,动态申请数据存在于堆(
heap)中。

10、嵌入式系统总是要用户对变量或寄存器进行位操作。
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。
在以上两个操作中,要保持其它位不变。

define BIT3 (0x1<<3)

static int a;

void set_bit3(void)
{
a |= BIT3;
}

void clear_bit3(void)
{
a &= ~BIT3;
}

11、 进程间通信的方式有?
进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享内存), SOCKET 等

12、48. 编写strcat函数,已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
(1)不调用C++/C 的字符串库函数,请编写函数 strcat
(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?

答(1):
char * strcat (char * dst, const char * src)
{
if(dst == NULL) {
return NULL;
}
Char *cp =dst;
while( cp )
cp++; /
find end of dst */ “hello”
while( *cp++ = src++ ) ; / Copy src to end of dst /
return( dst ); /
return dst */
}

答(2):方便赋值给其他变量

养生码农
原文地址:https://www.cnblogs.com/seamoon23/p/12102753.html