C语言数组插入元素后sizeof运算符无法正常工作的问题
C语言数组插入元素后sizeof不更新的原因及解决方法
你遇到的问题核心在于C语言的数组是固定大小的静态结构,sizeof运算符计算的是数组在编译时就确定好的总字节数,和运行时的操作完全无关。
问题细节拆解
- 你定义的
int array[] = {1,2,3,4,5};在编译阶段就被确定为包含5个int的数组,所以sizeof(array)永远等于5 * sizeof(int),不管你往里面写入多少元素,这个值都不会改变。用sizeof(array)/sizeof(array[0])计算的元素数自然也一直是5。 - 更严重的是,代码里
array[new_element_index] = user_input;属于数组越界访问:数组的合法索引范围是0到4,访问索引5的位置是未定义行为——它可能看起来能“正常”写入,但实际上会覆盖数组后面的内存数据,大概率导致程序崩溃或出现诡异的运行结果。
解决方法:使用动态内存实现可扩容数组
要实现能动态添加元素的数组,必须用malloc/realloc这类动态内存分配函数,在运行时调整内存大小。下面是修改后的示例代码:
// Exercise N9 - Code Win // Dynamic Arrays. #include <stdio.h> #include <stdlib.h> int main() { int user_input; // 初始分配5个int的内存空间 int *array = malloc(5 * sizeof(int)); if (array == NULL) { printf("内存分配失败\n"); return 1; } // 初始化数组元素 for (int i = 0; i < 5; i++) { array[i] = i + 1; } printf("Hey User !\n"); printf("Enter an element :\n"); scanf("%i", &user_input); // 扩容内存到6个int的大小 int *temp = realloc(array, 6 * sizeof(int)); if (temp == NULL) { printf("内存扩容失败\n"); free(array); return 1; } array = temp; // 将新元素插入到数组末尾 array[5] = user_input; // 用变量手动跟踪当前元素数量 int elements_number_after = 6; // 打印所有元素 for (int i = 0; i < elements_number_after; i++) { printf("%i ", array[i]); } printf("\n"); printf("扩容后的元素数:%i\n", elements_number_after); // 释放动态分配的内存,避免内存泄漏 free(array); return 0; }
关键注意事项
- 动态内存数组需要用指针管理,此时
sizeof(array)只会返回指针本身的大小(比如64位系统是8字节),所以必须自己用变量跟踪当前元素数量和内存容量。 - 使用
realloc时要先检查返回值:如果扩容失败会返回NULL,直接覆盖原指针会导致内存地址丢失,造成内存泄漏。 - 动态分配的内存一定要用
free释放,否则程序退出前会一直占用内存。
内容的提问来源于stack exchange,提问作者Fady Saad
相关产品推荐
相关产品推荐

