您的位置:js12345金沙官网登入 > 网络编程 > 程序员C语言经典笔试题

程序员C语言经典笔试题

2019-10-02 10:00

这些是C/C++能做的

内存分配方式有三种: 

服务器开发工程师、人工智能、云计算工程师、信息安全、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

  1. 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  2. 在栈上创建。 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 这个大小在linux上可以使用:ulimit -a | grep stack 来查看
  3. 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 

图片 1

#include <iostream>
using namespace std;
char * GetMemory(void){
    //p_arr是个数组的起始地址,这个数组的内容是存放在栈上面的。另外,非常值得一
    //提的是:系统没有为p_arr单独分配一个指针变量用来存放数组p_arr的起始地址。 
    char p_arr[] = "p_arr : hello world";

C语言是面向过程的,而C++是面向对象的

    //p_heap是一个指针变量,这个指针变量存在于栈上面,指针变量的值是指向的由
    //malloc分配得到的堆上的内存空间的起始地址。
    char *p_heap=(char *)malloc(sizeof(char)*20);

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    //ptr是一个指针变量,这个指针变量存在于栈上面,指针变量的值是指向的后面字符
    //串的起始地址,这个字符串是常量,是存在于静态存储区域的,不是在栈上,也不是
    //在堆上。
    char *ptr = "ptr : hello world";

1.以下程序的结果是什么?

    strcpy(p_heap,"p_heap: hello world");
    printf("%08Xn",p_arr);
    printf("%08Xn",&p_arr);
    printf("%08Xn",p_heap);
    printf("%08Xn",&p_heap);
    printf("%08Xn",ptr);
    printf("%08Xn",&ptr);
    puts(p_arr);
    puts(ptr);
    puts(p_heap);
    //return p_arr;
    return ptr;
}
int main(){
    char * str=NULL;
    str = GetMemory();
    printf("%08Xn",str);
    printf("%08Xn",&str);
    puts(str);
    return 0;
}

图片 2

上面程序输出的结果是:

A: main()函数里的i是一个未定义值

DC726BF0 

B: main()函数的i为1

DC726BF0

C: 编译器不允许这种写法

0EB29010

D: main()里i的值为0

DC726BE8

解答:当笔试者看到此代码时,可能会觉得古怪。虽然在C++中编译是可以通过的。当main()函数里的i从定义开始,外部的全局变量i就已经被屏蔽掉,所以main()函数里作为右值的i的值不会0也不会是1,与外部的i无关。而是一个未定义的符号。

004009D8

答案:A

DC726BE0

2.以下程序的输出结果是什么?

p_arr : hello world

图片 3

ptr : hello world

A:13 13

p_heap: hello world

B:112 13

004009D8

C :12 12

DC726C28

D:12 13

ptr : hello world

解析:本题主要考察指针以及栈的概念 。ptr首先指向数组arr的第一个元素,* += 100之后,arr中的0号元素即a[0]变成了111,别忘了ptr也向后挪了一位即指向1号元素,此时*ptr的值为12。问题来了:printf(“%d %d ”,*ptr,*的输出结果竟然不是12 13 而是13 13 原因在于printf的两个参数压栈顺序为从右至左,故也先计算*,所以ptr已经指向了arr[2],所以两次都是13

 

答案:A

这里面8有8行关于地址的输出,分别描述如下:

本文由js12345金沙官网登入发布于网络编程,转载请注明出处:程序员C语言经典笔试题

关键词: