1.关于下面代码描述不正确的是:
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个字节带回来
BCD已经说明了问题。核心问题就是子函数中的p是临时变量,改变它并不会改变主函数中的str。
2.以下哪个不是动态内存的错误( )
A.free参数为NULL
B.对非动态内存的free释放
C.对动态内存的多次释放
D.对动态内存的越界访问
这个题目是课本上的知识点
A选项,是对的,free函数传递NULL指针,什么事情都不发生
B,C,D都是错误的
3.关于下面代码描述正确的是( )
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说到点子上了。
A:printf函数的使用也是错误的, 如果要打印printf("%s", str); 这个是str指针是正常的情况下, 是可以的。 如果str是非法的, 那也会导致printf错误的
B选项:打印结果其实是不确定的。
D选项: 比较离谱,程序中并没有动态内存分配,所以不存在内存泄漏。
4.给你一个长度为
n
的整数数组nums
。请你构建一个长度为2n
的答案数组ans
,数组下标 从 0 开始计数 ,对于所有0 <= i < n
的i
,满足下述所有要求:
ans[i] == nums[i]
ans[i + n] == nums[i]
具体而言,
ans
由两个nums
数组 串联 形成。返回数组
ans
。
/** * 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; }
5.使用malloc函数模拟开辟一个二维数组
使用malloc函数模拟开辟一个3*5的整型二维数组,开辟好后,使用二维数组的下标访问形式,访问空间。
#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; }