西邮Linux兴趣小组2018年面试试题总结

这篇博客总结了西邮Linux兴趣小组2018年的面试试题,涉及二维数组的输出、sizeof与strlen的区别、静态变量的作用、编译过程、const指针的使用、指针与地址、main函数参数、位运算以及宏定义的应用。通过实例解析了各种概念的实际运用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
先定义了一个三乘三的二维数组,第一个输出的是第一行第二列所以为2,第二个输出的是第一行第三列为3,第三个为第三行第三列并且乘以-1故结果为-9。
在这里插入图片描述
因为int型一个占用四个字节,而a[3][2]占用了6个int型的空间,所以sizeof的结果为6*4为24,第二个printf中a[1][1]的结果为8,但是第一个是求sizeof的结果,因为是int型,故结果为4 8。第三个printf中一个是求str的sizeof结果一个是strlen结果,malloc函数申请了两个整型8个字节的位置,故sizeof结果为8,但是由于strlen遇到"\0"会停止,缺少2个字节,故结果为6。

在这里插入图片描述每次使用func()函数之后,b的值都会返回,但是不会改变其结果,因为为static静态变量,故每次的结果都保留了下来,所以每次的的结果都不同,依次递增。但是静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

在这里插入图片描述A:编译预处理,B:编译阶段,C:优化和汇编过程,D:链接阶段。
编译预处理阶段:当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。
编译阶段:在此阶段过程中,编译器会根据我们写好的代码,以此分析其中的语句,并对当中的某些语句执行替换,该替换是直接作用于.c文件。
优化和汇编过程:由于程序员自身的问题导致的代码出现多余的操作或者效率低的指令,优化过程可以找出并自动转化为更加好的指令。
链接阶段:一个过程只编译了一个模块,而一个程序往往包括多个模块,链接程序负责将这些模块组装起来构造出最后可以执行的程序。
在这里插入图片描述用 const 定义的变量的值是不允许改变的,不允许再给它重新赋值。
而第一句的p1定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容,故(2)是错误的。
而第二句的p2定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是const,可以直接通过str变量来修改str的值,但是却不能通过ptr指针来修改。故(4)是错误的。
在这里插入图片描述
%p用来输出指针的值、输出地址符。故第一个和第三个printf输出的结果都是a对应的地址的16进制结果,而第二个和第三个由于a+1和&a+1分别是在整形数组占据的4字节中的第一个和第四个,故结果是不同的两个地址。

在这里插入图片描述
main函数的返回值,用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其他数字的含义则由系统决定,通常,返回非零代表程序异常退出。而argc和argv是main函数的形式参数。这两个形式参数的类型是系统规定的。如果main函数要带参数,就是这两个类型的参数;否则main函数就没有参数。
在这里插入图片描述 num给2018的值,每次将i从0逐步增加,而2018依次递减进行按位与,最后结果为零。
在这里插入图片描述
这个*(int*)n相当于将int的内存与数组n的内容进行运算,第一位是乘以1,第二位为4的4次方,第三位为16的4次方,第四位为64的4次方。可知这个的结果为1。
在这里插入图片描述先对YEAR,LEVELONE,LEVELTWO,MULTIPLY进行了宏定义,所以第一步,要进行1+2*3的运算,结果为7并且赋值给x,然后给LEVELONE将YEAR化为字符串直接输出,得到XiyouLinux YEAR,然后又带入LEVETWO,又因为定义了YEAR为2018,故输出XiyouLinux 2018。
在这里插入图片描述结果不同,用%zu输出无符号整型即两个值,又因为这时因为VC存储数据的时候要具体采用对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量),icd中第一个为int是4,第二个是char为1但是要为8的倍数,所以要为其填充3个字节,所以为8,然后再加上double为8,结果为16,而cdi第一个为char不为8的倍数,所以填充到8,所以为16,再加int又不为8的倍数,故得到24。
在这里插入图片描述先输出有十六进制转字符,在输出a的数据长度8,结果为Linux 2018。
在这里插入图片描述

在这里插入代码片#include<stdio.h>
#include<malloc.h>
#include<string.h>
int Convert();
char * str;
int Convert(str)
{
	int n = 0;
	int m = str.length();
	int i = 0;
	while (i != m)
	{
		int c = str.charAt(i) - '0';
		n = n * 10 + c;
		i++;
	}
	return n;
}

int main(void) {
	int result;
	char * str= "12345";
	int res = Convert(str);
	printf("res应为%d", res);
	return 0;

}

在这里插入图片描述

#include<stdio.h>
#include<malloc.h>
#include<string.h>
void Swag(int str[], int len)
{
	int i, j;
	for (i = 0; i < len; i++)
	{
		if ((str[i] % 2) == 0)
			for (j = i + 1; j < len; j++)
			{
				int temp;
				if ((str[j] % 2) == 1)
				{
					temp = str[i];
					str[i] = str[j];
					str[j] = temp;
					break;
				}
			}
	}
}


int main()
{
	int i, j;
	int arr[] = { 0 };
	printf("请输入一组数组(依次输入)\n");
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		scanf_s("%d", &arr[i]);
	}
	Swag(arr, sizeof(arr) / sizeof(arr[0]));
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d", arr[i]);
	}

	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值