栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

西邮Linux兴趣小组2019补纳题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

西邮Linux兴趣小组2019补纳题

1. 下面代码的输出是什么?
struct A {
    long a;
    int b;
};
int main(int argc, char* argv[]){
    struct A num = {0x6e694c756f796978,0x7875};
    char ch = '0';
    for(int i = 0; ch; i++){
        ch = *((char *)&num + i);
        printf("%c",ch);
    }
    printf("n");
    return 0;
}

 xiyouLinux

家用计算机一般都为小端机,即低位在前。例如题中:0x7875  在计算机中“75”在前,“78”在后。for循环中先输出十六进制数“75”所对应的字符,后输出十六进制数“78”所对应的字符。


2. 改写代码,在不改变 const 的情况下尝试使用更多的方法改变b的值。
int main(int argc, char* argv[]){
    const int b = 10;
    // 自行添加语句,改变变量b的值
    return 0;
}

如下: 

int *p=(int *)&b;
//由于b被const修饰,所以用强制类型转换,暴力使p指向b
*p=1;

3. 阅读下面的代码,判断 a 中哪些元素被改变了,解释原因。
struct node {
    char a;
    int b;
    short c;
};
struct n{
    char a;
    int b;
};
int main(int argc, char* argv[]){
    struct node a[2] = {{1,2,3},{4,5,6}};
    *(int *)((char *)a + 2 * sizeof(struct n)) = 100;
    return 0;
}

a[1]中的b被改变了。

char占1字节,int占4字节,所以结构体n占8字节(char与int对齐)。

则 2 * sizeof(struct n)=16,由于结构体node的长度为12个字节,将a强制转换为char*类型后再加16,整个式子作为指针所指的是a[1].b(在结构体node中a,b,c各占4字节)。


4. 解释以下代码的输出结果。
void func(char *a)
{
    printf("%lun", sizeof(a));
    printf("%lun", strlen(a));
}
int main(int argc, char *argv[])
{
    char a[] = "hello world";
    char *b = "hello world";
    printf("%sn", b);
    func(a);
    printf("%lun", sizeof(a));
    printf("%lun", strlen(a));
}

hello world

8
11
12
11

 b作为字符串的首地址,用%s即可输出该字符串,

在func中,传入的a本质是指针,指针的大小为8字节(64位操作系统),所以sizeof的结果为8,而strlen是计算字符串长度的函数,可直接将首地址a传入计算得11。

在主函数中,sizeof(a)计算的是数组的大小,由于该字符串数组后面自动补了“”,所以结果为12。strlen()计算字符串长度,不包括末尾的“”。


5. 解释以下代码的输出结果。
#define f(a, b) a##b
#define g(a) #a
#define h(a) g(a)
int main(int argc, char *argv[])
{
    printf("%sn", h(f(1, 2)));
    printf("%sn", g(f(1, 2)));
}

#define做的是单纯的文本替换,先将所有的宏定义收集起来,然后处理源代码,发现一个宏定义符就立即替换。

##:连接操作。如宏中 1##2 得到的是 12(非字符串)

#:字符串化。如#f(1,2)得到的是"f(1,2)"

由于宏不处理字符串,则"f(1,2)"被保留了下来作为字符串输出了。

(1) 当宏中有#运算符时,#后面的将不再被替换;
(2) 当宏中有##运算符时,则先替换外层,再替换里层;

 


8. 下面这段程序有错吗?如果有错请指出并改正。
#include 
void func(char *p)
{
    p = (char *)malloc(sizeof(char));
}
int main(int argc, char *argv[])
{
    char *s = NULL;
    func(s);
    strcpy(s, "I love xiyou_linux");
    puts(s);
}

改正:

#include 
char * func(void)
{
    char* p = (char *)malloc(sizeof(char));
    return p;
}
int main(int argc, char *argv[])
{
    char *s = func();
    strcpy(s, "I love xiyou_linux");
    puts(s);
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630651.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号