You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:02:49