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);  
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值