第一题,给出给定程序的输出,程序很简单,这儿就不写了。本题关键在于sizeof的用法
char a[10] = {1, 2, ..., 10};
#define Total (sizeof(a)/sizeof(a[0]))
关于sizeof的用法,总结如下
sizeof的参数如果是一个对象,比如数组名,结构体名,那么sizeof的返回值就是该对象占有内存的空间大小;如果sizeof的参数为指针,那么在32位机器上的返回值就是4。下面是我为了验证该想法所做的一个实验。
#include <stdio.h>
#include <string.h>
struct Node
{
char a;
int b[2];
};
typedef struct Node *ptrToNode;
typedef struct Node List;
int main()
{
char a[5]={'1', '2', '3', '4', '5'};
char *b = "12345";
char c[] = "12345";
printf("%d, %d, %d, %d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c), strlen(a), strlen(b), strlen(c));
printf("%d %d\n", sizeof(ptrToNode), sizeof(List));
return 0;
}
结果为
5, 4,6, 7, 5, 5
4, 12
从这个例子中可以看出,如果sizeof(c)的话,因为该对象是一个字符串,因此sizeof也将其尾零统计在内;另外,strlen的原理为打印出从字符串首字符开始,一直到尾零的前一个字符。所以strlen(a)的长度为7,因为在内存中,char[4]之后的字符是不确定的,可能不为0,因为strlen的统计不会结束。
第二题,进程所占用的资源有哪些?linux中有三类典型的线程,分析其各自的特点。
第三题,有三个一维的向量A[N], B[N], C[N], 其中C[i] = A[i] + B[i],用循环可以实现
for(i = 0; i < N; i++)C[i] = A[i] + B[i];
如果使用多线程的话,题目中给了下面的方法
<1, 1, N>开启 N个 kernel,具体的方法我忘了。。。
如果计算C[N][N] = A[N][N] * B[N][N],如何来做。
第四题,有一个unsigned int的数4,一个int型的数-20,判断两数相加是大于0还是小于0;
已知一个struct的结果,如
struct contain
{
void *p;
itn b;
listhead *next;
}
现在已知plist = contain.next,能否求出结构体contain的地址。
这个题,我想了两种办法,一是由各成员变量的长度去计算,还有就是通过通用链表来做,爱立信电话面试就面过这个题,但是后来忘复习了,引以为戒。
第五题,写add.h和add.c,实现整数相加的功能,并且头文件可以被c++程序调用,另外解释头文件的代码主要做了什么。
这让我想起#include具体都做些了什么工作 这个问题。
第六题,各种变量的定义,什么定义整型变量,指向整型的指针(数组)等等。
编程题
1、用程序获得链表倒数第n个节点
2、删除字符串中的空格字符
3、写程序求一数组相邻元素最大和。
算法题
1、设计算法,实现linux命令行下tab键命令补全功能
2、设计算法,将多个字符串按照字母表顺序排序,比如ced, agh, bes, opea, owdif,排列后是agh,bes, ced, opea, owdif.
到现在还没offer,努力!