C/C++中如何修改数组末尾以手动调整静态int数组大小为5?
C语言中调整数组长度的实现说明
原有代码无法生效的本质原因
- 定义的
int arr[10]是栈上的静态定长数组,它的内存大小在编译阶段就已经固定,运行时没有任何手段可以修改已声明完成的静态数组的固有内存长度。无论给数组靠后的元素赋什么值,都不会改变数组本身的总内存占用,常规64位环境下sizeof(arr)始终会返回40,对应10个int的总长度。 - 代码里的
arr[5] = nullptr本身存在类型错误:nullptr是C++引入的空指针常量,原生C语言没有对应语法,直接给int类型的数组元素赋值会触发编译报错;就算能隐式转换为0值,也只是把第6个位置的整数设为0,完全达不到截断数组的效果。
正确实现路径
根据实际使用需求,有两种可落地的实现方式:
仅需逻辑上前5个元素有效(无需释放多余内存)
这种场景不需要改动数组本身的内存布局,只需要额外维护一个记录有效长度的变量,所有数组访问逻辑都限制在这个长度范围内即可,零额外开销:
int arr[10]; for (int i = 0; i < 10; i++) { arr[i] = i + 1; } // 自定义有效长度,后续所有操作仅访问0~4下标的元素 int valid_len = 5;
需要物理层面回收多余内存
如果确实需要把内存块的实际占用从10个int缩小到5个int,不能使用栈上的静态定长数组,需要改用堆上动态分配的内存,搭配realloc接口完成长度调整:
#include <stdio.h> #include <stdlib.h> int main() { // 初始在堆上分配10个int的内存空间 int *arr = (int*)malloc(10 * sizeof(int)); if (arr == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 初始化赋值 for (int i = 0; i < 10; i++) { arr[i] = i + 1; } // 将内存块调整为5个int的长度 int *adjusted_arr = (int*)realloc(arr, 5 * sizeof(int)); // 校验调整结果,避免内存泄漏 if (adjusted_arr == NULL) { perror("realloc failed"); free(arr); exit(EXIT_FAILURE); } arr = adjusted_arr; // 自行记录调整后的实际长度:指针本身无法反映指向内存块的大小 int cur_len = 5; // 业务逻辑... // 程序结束前手动释放内存 free(arr); return 0; }
注意:动态分配的内存通过指针访问时,
sizeof(指针)只会返回指针本身的长度(64位环境下为8字节),不会返回指向内存块的总大小,因此必须通过自定义变量记录当前内存块的实际有效大小。
内容的提问来源于stack exchange,提问作者Mohammed Thaier
相关产品推荐
相关产品推荐

