1.以下关于枚举的说法,哪个是正确的?( )
A.枚举类型可以具有浮点数作为枚举值。
B.枚举类型在内存中存储为整数。
C.枚举类型可以包含字符串作为枚举值。
D.枚举类型不能作为函数的参数传递。
解析:选择B项,枚举类型在内存中存储为整数,其他选项都是不正确的。
2.下面代码的结果是:( )
enum ENUM_A
{
X1,
Y1,
Z1 = 255,
A1,
B1,
};
enum ENUM_A enumA = Y1;
enum ENUM_A enumB = B1;
printf("%d %d\n", enumA, enumB);
A.1, 4
B.1, 257
C.2, 257
D.2, 5
解析:选择B项,枚举默认从0开始,所以X1是0,故Y1是1,给了数字后会根据数字向后推,那么Z1是255,A1是256,所以B1是257,故选B。
3.关于枚举常量和#define 定义常量,下面哪个表述是不严谨的?( )
A.可读性更好:枚举符号提供了有意义的标识符,可以更清晰地表达代码的意图。相比之下,#define定义的符号只是简单的文本替换,不具备语义上的含义。
B.和#define定义的标识符比较枚举有类型检查,更加严谨。
C.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用,#define定义的符号没有作用域概念,会在整个代码中进行文本替换
D.#define没有类型检查,使用更加方便,更加推荐使用
解析:选择D项。
A:正确
B:正确
C:正确
D:枚举是一种类型,有类型检查,但是#define定义的符号没有类型检查,就是简单的替换,使用虽然方便,但是也很容易导致问题,所以更加推荐使用枚举常量。
4.下面代码的结果是:( )
A.14
B.4
C.16
D.18
解析:选择C项。
结构体向int对齐,7个short一共是14字节,对齐后是16字节。n是单独的4字节,由于是union,所以n与s共用空间,只取最长的元素,故占用16字节。
5.在X86下,小端字节序存储,有下列程序,输出结果是( )
#include<stdio.h>
int main()
{
union
{
short k;
char i[2];
}*s, a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x\n", a.k);
return 0;
}
A.3839
B.3938
C.380039
D.不确定
解析:选择A项。union只有2字节,2字节的十六进制只有4位,所以答案CD排除。而位顺序类似小端,低地址在低处,所以39是低地址,在低位,38在高位,所以是3839,故选A。
6.关于动态内存函数的说法错误的是:( )
A.malloc函数向内存申请一块连续的空间,并返回起始地址
B.malloc申请空间失败,返回NULL指针
C.malloc可以向内存申请0字节的空间
D.malloc申请的内存空间,不进行释放也不会对程序有影响
解析:选择D项。
说明:不释放会产生内存泄漏,小型程序可以不关注,但是在中大型程序上影响极其深刻。故选D。AB是函数的基本功能,C选项比较特殊,malloc(0)是允许的,也会返回一个指针,只是没有空间所以不可使用而已。
7.关于动态内存相关函数说法错误的是:( )
A.malloc函数和calloc函数的功能是相似的,都是申请一块连续的空间。
B.malloc函数申请的空间不初始化,calloc函数申请的空间会被初始化为0
C.realloc函数可以调整动态申请内存的大小,可大可小
D.free函数不可以释放realloc调整后的空间
解析:选择D项。
realloc在操作过程中是释放旧空间分配并返回新空间,所以返回的新空间也是需要释放的,故选D。AB是malloc和calloc的区别。C是realloc的基础功能。
8.动态申请的内存在内存的那个区域?( )
A.栈区
B.堆区
C.静态区
D.文字常量区
解析:选择B项。基本概念。动态内存分配都是在堆上分配的。
9.关于下面代码描述不正确的是:( )
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
A.上面代码没问题
B.上面代码存在内存泄露
C.上面代码可能会崩溃,即使GetMemory函数返回,str依然为NULL
D.GetMemory函数无法把malloc开辟的100个字节带回来
解析:选择A项。BCD已经说明了问题。核心问题就是子函数中的p是临时变量,改变它并不会改变主函数中的str。
10.以下哪个不是动态内存的错误( )
A.free参数为NULL
B.对非动态内存的free释放
C.对动态内存的多次释放
D.对动态内存的越界访问
解析:选择A项。
这个题目是课本上的知识点。A选项,是对的,free函数传递NULL指针,什么事情都不发生。B,C,D都是错误的。
11.关于下面代码描述正确的是( )
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
A.printf函数使用有问题
B.程序正常打印hello world
C.GetMemory函数返回的地址无法正常使用
D.程序存在内存泄露
解析:选择C项。
说明:此题考的是“局部变量的指针不能做返回值,因为函数内的空间在函数返回后就会释放调”这一点。只有C说到点子上了。
A:printf函数的使用也是错误的, 如果要打印printf(“%s”, str); 这个是str指针是正常的情况下, 是可以的。 如果str是非法的, 那也会导致printf错误的
B选项:打印结果其实是不确定的。
D选项: 比较离谱,程序中并没有动态内存分配,所以不存在内存泄漏。
12.编程题
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* getConcatenation(int* nums, int numsSize, int* returnSize) {
//定义一个长度为nums数组长度两倍的数组ans
int* ans = malloc(2*numsSize * sizeof(int));
int i = 0;
//遍历nums数组,将下标为x的元素分别赋值给ans数组中下标为x和下标为x+m的元素;
for(i=0; i<numsSize; i++) {
ans[i] = nums[i];
ans[i+numsSize] = nums[i];
}
//更新数组长度并返回数组
*returnSize = 2*numsSize;
return ans;
}
13.编程题
14.编程题
#include <stdio.h>
int main()
{
//开辟
int** p = (int**)malloc(3 * sizeof(int*));
int i = 0;
for (i = 0; i < 3; i++)
{
p[i] = (int*)malloc(5 * sizeof(int));
}
//使用
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
p[i][j] = 5 * i + j;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
for (i = 0; i < 3; i++)
{
free(p[i]);
}
free(p);
p = NULL;
return 0;
}
15.编程题
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
标签:malloc,27,函数,05,int,2024,枚举,str,printf
From: https://blog.csdn.net/m0_46676283/article/details/139393100