内存空间常见面试题
C 内存 分配 访问 操作
变量名 行为—>分配 一段空间
- 找到能作为变量名的标识符
- 以他为中心节点,先向右看,再左边
- 回答问题
问题:下列变量的含义
-
char a1;
a1 ---- char 分配1B空间 sizeof(a1)== 1
`char a2[5]
a2 ---- [] 数组名(数组名是一个标签,不占用内存空间) sizeof(a2) == 5 (本身是伪命题,数组不占内存空间,所以c语言有一个语法转换,要回答两个问题——1.多少个元素2.每个元素多大) -
char *p1 p1 ----
*保存地址的空间 sizeof(p1) == 4B/8B (系统地址总线的大小来决定)
const char * p2
表示p2这把钥匙里的东西不能写只能读
char * const p3 表示p3只能存固定一把钥匙,可以写
const char * const p4
表示p4是固定这包钥匙不能动,这把钥匙里的东西依旧不能动不可以写 -
char * b1[5]
b1 ---- 标签(数组)
5个 * — char(访问方式)
char (*b2)[5]
b2 ---- 空间 里面可以存地址,数组行为访问 5个char作为一个对象 -
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;
}