在 C 语言的笔试或面试中,getmemory 相关的题目通常考察动态内存分配、指针操作以及内存管理的知识。以下是一些常见的 getmemory 相关题目及其分析和解答。
题目 1:动态分配内存并返回指针
题目描述
编写一个函数 getmemory,该函数动态分配一个大小为 n 的整型数组,并返回指向该数组的指针。如果分配失败,返回 NULL。
#include <stdio.h>
#include <stdlib.h>
int *getmemory(int n) {
int *ptr = (int *)malloc(n * sizeof(int));
if (ptr == NULL) {
return NULL; // 分配失败
}
return ptr;
}
int main() {
int n = 10;
int *arr = getmemory(n);
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// 使用分配的内存
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// 打印数组
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
分析
动态分配内存:使用 malloc 分配 n 个整型大小的内存。
检查分配结果:如果 malloc 返回 NULL,说明分配失败,函数返回 NULL。
释放内存:使用 free 释放分配的内存,避免内存泄漏。
题目 2:修改指针指向的内存
题目描述
编写一个函数 getmemory,该函数修改传入的指针 p,使其指向一个动态分配的字符串 "Hello, World!"。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getmemory(char **p) {
*p = (char *)malloc(20 * sizeof(char)); // 分配内存
if (*p == NULL) {
return; // 分配失败
}
strcpy(*p, "Hello, World!"); // 复制字符串
}
int main() {
char *str = NULL;
getmemory(&str); // 传递指针的地址
if (str == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
printf("%s\n", str); // 输出字符串
// 释放内存
free(str);
return 0;
}
分析
传递指针的地址:通过传递指针的地址(char **p),可以修改指针的值。
动态分配内存:使用 malloc 分配内存,并将地址赋值给 *p。
复制字符串:使用 strcpy 将字符串复制到分配的内存中。
释放内存:使用 free 释放分配的内存。
题目 3:返回局部变量的指针
题目描述
以下代码有什么问题?如何修复?
#include <stdio.h>
int *getmemory() {
int arr[10];
for (int i = 0; i < 10; i++) {
arr[i] = i + 1;
}
return arr; // 返回局部变量的地址
}
int main() {
int *ptr = getmemory();
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
return 0;
}
问题分析
局部变量的生命周期:arr 是局部变量,函数返回后其内存会被释放,返回的指针指向无效内存。
未定义行为:访问已释放的内存会导致未定义行为。
修复方法
使用动态内存分配,确保内存的生命周期不受函数作用域限制。
修复代码
#include <stdio.h>
#include <stdlib.h>
int *getmemory() {
int *arr = (int *)malloc(10 * sizeof(int)); // 动态分配内存
if (arr == NULL) {
return NULL; // 分配失败
}
for (int i = 0; i < 10; i++) {
arr[i] = i + 1;
}
return arr; // 返回动态分配的内存地址
}
int main() {
int *ptr = getmemory();
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放内存
free(ptr);
return 0;
}
题目 4:二维数组的动态分配
题目描述
编写一个函数 getmemory,动态分配一个 m x n 的二维整型数组,并返回指向该数组的指针。
#include <stdio.h>
#include <stdlib.h>
int **getmemory(int m, int n) {
int **arr = (int **)malloc(m * sizeof(int *)); // 分配行指针
if (arr == NULL) {
return NULL; // 分配失败
}
for (int i = 0; i < m; i++) {
arr[i] = (int *)malloc(n * sizeof(int)); // 分配每行的内存
if (arr[i] == NULL) {
// 如果某一行分配失败,释放之前分配的内存
for (int j = 0; j < i; j++) {
free(arr[j]);
}
free(arr);
return NULL;
}
}
return arr;
}
int main() {
int m = 3, n = 4;
int **arr = getmemory(m, n);
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// 使用分配的内存
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = i * n + j + 1;
}
}
// 打印二维数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < m; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
分析
动态分配二维数组:
先分配行指针(int **arr)。
然后为每一行分配内存(arr[i])。
错误处理:如果某一行分配失败,释放之前分配的内存。
释放内存:先释放每一行的内存,再释放行指针。
总结
getmemory 相关的题目主要考察以下知识点:
动态内存分配:使用 malloc、calloc 或 realloc。
指针操作:传递指针的地址以修改指针的值。
内存管理:确保分配的内存被正确释放,避免内存泄漏。
错误处理:检查内存分配是否成功,并处理失败情况。