C语言内存面试题

内存空间常见面试题

C 内存 分配 访问 操作
变量名 行为—>分配 一段空间

  1. 找到能作为变量名的标识符
  2. 以他为中心节点,先向右看,再左边
  3. 回答问题
    问题:下列变量的含义
  1. char a1;
    a1 ---- char 分配1B空间 sizeof(a1)== 1
    `char a2[5]
    a2 ---- [] 数组名(数组名是一个标签,不占用内存空间) sizeof(a2) == 5 (本身是伪命题,数组不占内存空间,所以c语言有一个语法转换,要回答两个问题——1.多少个元素2.每个元素多大)

  2. char *p1 p1 ---- *保存地址的空间 sizeof(p1) == 4B/8B (系统地址总线的大小来决定) const char * p2
    表示p2这把钥匙里的东西不能写只能读
    char * const p3 表示p3只能存固定一把钥匙,可以写 const char * const p4
    表示p4是固定这包钥匙不能动,这把钥匙里的东西依旧不能动不可以写

  3. char * b1[5]
    b1 ---- 标签(数组)
    5个 * — char(访问方式)
    char (*b2)[5]
    b2 ---- 空间 里面可以存地址,数组行为访问 5个char作为一个对象

  4. char * fun1(int)
    fun1 ---- 函数标签
    输入参数 1个int
    返回值 返回了一把 *
    ---- char 访问
    char (* fun2)(int)
    fun2 ---- 保存地址的空间
    这把钥匙存的是函数类型的空间
    输入参数是 int
    返回值是 char

  • 变量类型规定了变量在内存的所占空间⼤⼩,编译器提供了sizeof关键字可以获取变量或数据类型在这款编译器的⼤⼩。
    例题 回答下面变量表示的是什么
    int (*s[10])(int)
    s ---- 数组(标签)
    10
    * ----函数地址
    ----int行为访问
    void (*signal(int,void(*)(int)))(int)
    signal ---- 函数名
    输入参数 2个 int和函数地址 void(int void)
    返回值 地址地址
    输入参数是int 返回为空的函数
    让上面的代码更加可读性
    typedef void(*handler)(int);
    handler singal(int,handler);

  • 在64位系统下,分别定义如下两个变量:
    char * p[10] char(*p1)[10]
    请问,sizeof§和sizeof(p1)分别值为:80和8

  • 已知代码如下,填空:
    unsigned char *p1;
    unsigned long *p2;
    p1 = (unsigned char *)0x801000;
    p2 = (unsigned long *)0x810000;
    p1+5= 0x801000+5 * sizeof(char)= 0x801005
    p2+5= 0x810000+5 * sizeof(long)= 0x810000+20 = 0810000+0x14 = 0x810014

#include "stdio.h"
void main() {
int a[5] = {1, 2, 3, 4, 5};
int b[5] = {0, 2, 1, 3, 0};
int i, s = 0;
for(i = 0; i < 5; i++)      //5次
s = s + a[b[i]];           //累加
printf("%d\n", s);
}

打印结果是 1+1+2+3+4=11

#include <stdio.h>
char buffer[6] = {0};
char *mystring()
{
	char *s = "Hello world";
	for(int i = 0;i < (sizeof(buffer) - 1); i++)  //循环五次
	{
	buffer[i] = *(s+i);
	}
	return buffer;
}
int main(int args,char**argv)
{
	printf("%s\n",mystring());
	return 0;
}

在64bit系统下,下列代码输出的是什么 Hello

下⾯程序的运⾏结果是: To be a good man

void test2() {
	int i;
	char **p;
	int msg[16] = {0x40, 0x41, -1, 0x00, 0x01, -1, 0x12, -1,
					0x20, 0x27, 0x41, 0x35, -1, 0x51, 0x12, 0x04};
	char *strArr[] = {"beijing", "shanghai", "guangzhou", "guangdong", "Tokyo",
						"American"};
	char *(*pStr)[6];
	pStr = &strArr;
	p = strArr;
	for (i = 0; i < 16; i++)
	 {
		if (msg[i] == -1){
			putchar(' ');
				continue;
		  } 
		  else if ((msg[i] & 0xF0) == 0x40){
				putchar(p[msg[i] >> 4][msg[i] & 0x0F]);
				continue;
			}       //这三条if输出都是通过高四位找第几个字符,通过第四位找第几个索引号
		  else if ((msg[i] & 0xF0) == 0x30) {
			putchar(*(strArr[msg[i] >> 4] + (msg[i] & 0x0F)));
			continue;
			} 
			else {
			putchar(*((*pStr)[msg[i] >> 4] + (msg[i] & 0x0F)));
			}
	}
	printf("\n");
}

若有以下输⼊(代表回⻋换⾏符),则下⾯程序的运⾏结果为: 7

int main(void) {
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int (*p)[4], i, j;
	p = a;
	scanf(“%d,%d”,&i,&j);      //输入  1  2
	printf(“%d\n”, *(*(p+i)+j));
	return 0;
	}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值