linux兴趣小组2017面试题浅析

linux兴趣小组2017面试题

1. 分析下列程序的输出.

int main(int argc, char *argv[])
{int t = 4;printf("%lu\n", sizeof(t--));printf("%lu\n", sizeof("ab c\nt\012\xa1*2"));return 0;
}
  1. 若运行printf(“%d\n”,t); 结果为4,因为sizeof是关键字,且其后面的内容在编译时运算并替换为运算后的数值,在运行程序时直接调用替换值,不再进行t–的运算,故t仍是4.
  2. 在进行sizeof运算时,\n\012\xa1 分别为一个字符,且包含结束符\0.

2. 下面代码会输出什么?

int main(int argc, char *argv[])
{int a = 10, b = 20, c = 30;printf("%d %d\n", b = b*c, c = c*2) ;printf("%d\n", printf("%d ", a+b+c));return 0;
}
  1. printf函数的运行机制为在栈上申请存储空间, 规则为先进后出, 因此printf()表现为参数从右向左运算, 即 c = 60 (c = 2), b = 1200 (b = c).
  2. printf函数的返回值为所打印字符的列宽(长度).

3.下面代码使用正确吗?若正确,请说明代码的作用;若不正确,请指出错误并修改。

void get_str(char *ptr)
{ptr = (char*)malloc(17);strcpy(ptr, "Xiyou Linux Group");
}
int main(int argc, char *argv[])
{char *str = NULL;get_str(str);printf("%s\n", str);
}
  1. 主函数中的指针变量str指向空指针, 在作为参数传进函数 get_str 时传给 ptr 时, 在被调函数中仅仅将 ptr 指向的内存地址变为了malloc函数申请的空间, 而主函数中的str仍指向空指针,并不会输出字符.
  2. 解决方法:
    1) 使用二级指针

    void get_str(char **ptr)
    {*ptr = (char*)malloc(17);strcpy(*ptr, "Xiyou Linux Group");
    }
    int main(int argc, char *argv[])
    {char *str = NULL;get_str(&str);printf("%s\n", str);
    }

    2) 使用函数返回值将新地址返回

    char * get_str(char *ptr)
    {ptr = (char*)malloc(17);strcpy(ptr, "Xiyou Linux Group");return ptr;
    }
    int main(int argc, char *argv[])
    {char *str = NULL;str = get_str(str);printf("%s\n", str);
    }

4. 请解释下面代码的输出结果。

size_t q(size_t b)
{return b;
}
size_t (*p(char *str))(size_t a)
{printf("%s\n", str);return q;
}
int main(int argc, char *argv[])
{char str[] = "XiyouLinuxGroup";printf("%lu\n", p(str)(strlen(str)));return 0;
}
  1. 该题考察的点为返回值为函数指针的函数(详情见《LinuxC 编程实战》P78).
  2. size_t (*p(char *str))(size_t a)是一个返回值为函数指针的函数,首先看 p ,因为()的优先级比*高,所以p先与()结合,p(char *str)是含有字符型指针参数的函数,返回值是size_t (*)(size_t a),也就是一个指向函数的指针.该指针指向的函数有size_t类型的参数.

9. 说明下面程序的运行结果。

int main(int argc, char *argv[])
{int a, b = 2, c = 5;for(a = 1; a < 4; a++){switch(a){b = 99;case 2:printf("c is %d\n", c);break;default:printf("a is %d\n", a);case 1:printf("b is %d\n", b);break;}}return 0;
}
  1. 输出结果为:

    b is 2
    c is 5
    a is 3
    b is 2
  2. switch 中 case 之上的语句(赋值语句,输出语句等)会被跳过, 在本题中表现为 b = 99; 被跳过, 因此b的值仍为2.

14. 请修改下面的 swap 函数,使得既可以交换 int 类型的参数,也可以交换 double 类型的参数。

void swap(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}
  1. 可以用宏定义:

    #define swap(a, b) ((x)=(x)+(y),(y)=(x)-(y),(x)=(x)-(y))
  2. 多加一个参数代表数字所占字节数,并使用memcpy函数:

    void swap(int *a, int *b, int size)
    {
    char buffer[8];
    memcpy(buffer, a, size);
    memcpy(a, b, size);
    memcpy(b, buffer, size);
    }

16. 请设计一个程序,通过命令行参数接收一个文件名 filename.txt( 纯文本文件 ) 和一个整型数字 n,实现从 filename.txt 中删除第 n 行数据。

详细内容请看大佬的10种解法

17.解释程序输出结果

struct node
{char a;short b;int c;
};
int main(int argc, char *argv[])
{struct node s;memset(&s, 0, sizeof(s));s.a = 3;s.b = 5;s.c = 7;struct node *pt = &s;printf("%d\n", *(int*)pt);printf("%lld\n", *(long long *)pt);return 0;
}
  1. 本题主要考察大小端内存对齐强制类型转换问题。
  2. 大小端 : 一般电脑采用小端,即存储时“低位在前,高位在后”,例如整型1在存储时二进制码为0000...0001(31个0, 1个1),而在内存中存储时,实际存放顺序为

    00000001
    00000000
    00000000
    00000000

  3. 为了提高计算机读取内存内容的速度,采用的内存对齐的方法,各变量存储的首地址必须为 自身所占内存大小 的整数倍。因为该结构体中a占1字节, b占2字节, c占4字节, 若a,b之间无空字节,则c首地址将会是3(设首地址为0), 且b首地址将是1, 不符合规则, 因此在a后添加一个空字节(内容全为0),以及技能性内存对齐;

  4. 强制类型转换 : 以 (int*)pt 为例,将该数组强制转化为 int 型,即读取时只读取前四个字节的内容,再转化为整型输出。
  5. 深入了解请看大佬的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 701——The Archeologists\' Dilemma

题意&#xff1a;一个考古学家发现一些疑似外星人的数字&#xff0c;然后硬扯到2的n次方上&#xff0c;给定一个数&#xff0c;使其是2的n次方的前缀&#xff0c;然后求n&#xff0c;还有个要求即该数作为前缀的长度要小于总长度的一半。思路&#xff1a;想了很久不得思路的一道…

linux下搜狗输入法无法输入中文解决方法

今天打开电脑&#xff0c;突然发现之前一直用的很好的搜狗输入法突然炸了&#xff0c;竟然没法输中文&#xff0c;在谷歌了几个解决方法后&#xff0c;终于找到了一个能用的方法。记录下来&#xff0c;已备后用。 解决方法: 关闭搜狗输入法 killall fcitx删除配置文件 ~/.co…

uva 550——Multiplying by Rotation

题意&#xff1a;在一个进制内 比如十进制下179487 * 4 717948和9进制下17 * 4 71 给定三个数&#xff0c;一个是进制&#xff0c;一个数是该组数的最后一个数字&#xff0c;另外一个则是该组数中的一个因数&#xff0c;问该组数中另一个因数是多少位数。思路&#xff1a;由最…

linux与windows编码转化

最近在写实验报告时&#xff0c;由于在机房只能用windows系统&#xff0c;在程序没写完而转战linux时却总是发生出现乱码问题&#xff0c;之前修改几次无果&#xff0c;只好改为英文。今天特地抽出时间来解决这一问题&#xff0c;解决方法如下&#xff1a; 使用iconv命令: ico…

uva 138——Street Numbers

题意&#xff1a;一个老师闲来无事就从他家门口向前走&#xff0c;然后累加门牌数&#xff0c;最后发现向前走和向后累加到的门牌数一样&#xff0c;然后让求该老师家的门牌数&#xff0c;枚举出前6个。思路&#xff1a;假设门牌数为1-n&#xff0c;该老师的门牌号为m&#xff…

再见“小明爬楼梯”问题

在c语言期末考试中&#xff0c;再次见到了“小明爬楼梯”问题&#xff0c;而第一次见到是在某次面试题中&#xff0c;由于当时还没有学到递归部分&#xff0c;因此就仅仅把代码看了一下&#xff0c;然而其中包含的思想却没有弄清楚&#xff0c;因此在考试时见到该题一头雾水&am…

uva 10539——Almost Prime Numbers

题意&#xff1a;给定一个区间范围&#xff0c;然后问在这个范围之内有多少个数是素数的整数倍&#xff0c;就是能够化成一个素数乘方的形式思路&#xff1a;首先要打一张sqrt&#xff08;N5)大小的素数表&#xff0c;然后对在在这个区间的数依次进行枚举做因数分解&#xff0c…

linux下隐藏输入密码

在做课设时&#xff0c;因为在windows上写了一个输入密码时屏幕显示为***的函数&#xff0c;但是在移植到linux系统上时却有问题&#xff0c;提示有错误。 上网搜索&#xff0c;有人说getch()函数的头文件是curses.h,还有人说是conio.h, 但是在ubuntu系统中都不能使用&#xf…

uva 11105——Semi-prime H-numbers

题意&#xff1a;定义了一种H素数&#xff0c;改素数的定义是能够被4整除余数为1&#xff0c;然后给定一个n值&#xff0c;问1到n中有多少个只被分解成两个H素数的数&#xff0c;题目很绕&#xff0c;H素数和他要球的东西一直搞不明白&#xff01;思路&#xff1a;最好的办法是…

文件操作总结(一)

该部分将作为日常学习的总结&#xff0c;内容将会比较杂乱&#xff0c;只有整体上的主题——文件操作。 主要目录的存储内容 /bin 全称binary&#xff0c; 存放普通用户可执行的命令/boot 存放Linux内核及开机启动的相关文件/etc 存放系统的配置文件/usr 存放系统应用程序及相…

uva 294 ——Divisors

题意&#xff1a;给定一个区间[l,r],然后问在该区间内谁的因子最多&#xff01;思路&#xff1a;先大致分析一下&#xff0c;比如对于一个数12&#xff0c;那么可以拆分成2*2*3&#xff0c;就是对一个数分解质因数&#xff0c;然后你会发现在组成因子的时候&#xff0c;每个质因…

邮箱验证 ——ACM

邮箱验证POJ 注册的时候需要用户输入邮箱&#xff0c;验证邮箱的规则包括&#xff1a; 1)有且仅有一个符号 2)和.不能出现在字符串的首和尾 3)之后至少要有一个.&#xff0c;并且不能和.直接相连 满足以上3条的字符串为合法邮箱&#xff0c;否则不合法&#xff0c; 编写程…

uva 10140——Prime Distance

题意&#xff1a;题目出的很简单&#xff0c;给定一个数据范围&#xff08;好吧&#xff0c;又是给定一个范围&#xff09;&#xff0c;然后问你在这个给定的范围内&#xff0c;哪两个相邻素数挨的最近&#xff0c;哪两个最远。思路&#xff1a;这破题数据量很大&#xff0c;如…

Lowest Common Multiple Plus ——ACM

1. Lowest Common Multiple Plus求n个数的最小公倍数。Input 输入包含多个测试实例&#xff0c;每个测试实例的开始是一个正整数n&#xff0c;然后是n个正整数。为每组测试数据输出它们的最小公倍数&#xff0c;每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整…

文件操作(二) 其他总结

一、 文件操作 1、 获取文件属性 #include<sys/types.h> #include<sys/stat.h> #include<unistd.h>int stat(const char *filename, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *filename, struct stat *buf);部分常用…

【转】博弈知识汇总

有一种很有意思的游戏&#xff0c;就是有物体若干堆&#xff0c;可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干&#xff0c;规定最后取光物体者取胜。这是我国民间很古老的一个游戏&#xff0c;别看这游戏极其简单&#xff0c;却蕴含着深刻的数学原理。下面我们…

搞ACM的你伤不起(转)

笑喷了。。。。。。。。。劳资六年前开始搞ACM啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 从此踏上了尼玛不归路啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#x…

学计算机的你伤不起啊(转)

学计算机的你伤不起啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 老子六年前开始学计算机啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;于是踏上了尼玛不归路啊&#xff01;&#xff01;&#xff01;&#xff…

进程控制 (二) Others

1. 执行新程序 只列出几个常用的函数&#xff1a; #include <unistd.h> int execve(const char *path, char * const argv[], char * const envp[]);//envp[]为环境变量&#xff0c;可直接调用int execv(const char *path, char * const argv[]);//与execve&#xff08…

【转载】ACM中矩阵乘法的应用

copied from 大神s blog 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中&#xff0c;一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵&#xff0c;得到的结果是一个n行p列的矩阵&#xff0c;其中的第i行第j列位置上的数等于前一…