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

C语言打印无预定长度数组:使用sizeof计算长度报错咨询

你的数组打印问题分析与解决办法

首先直接点出你代码里的致命错误:

  • 多了不必要的+1!数组的实际元素个数计算公式就是sizeof(my_array) / sizeof(my_array[0]),因为数组下标是从0开始的——比如一个有5个元素的数组,合法下标是0到4,循环条件i < 数组长度就刚好能遍历所有元素。你加了+1后,循环会多跑一次,访问到数组越界的内存位置,这属于C语言里的未定义行为,轻则打印乱码,重则直接触发程序崩溃报错。

修正后的基础可行代码

把+1去掉,你的代码就能正常工作了:

// 先假设my_array是在当前作用域定义的字符串数组(比如用户输入填充的)
char my_array[10][20]; 

// 正确计算数组长度:移除多余的+1
int length = sizeof(my_array) / sizeof(my_array[0]);
printf("数组元素个数:%d\n", length);

// 循环遍历打印所有元素
for(int i = 0; i < length; i++) {
    printf("%s\n", my_array[i]);
}

其他实用方案

1. 手动传递数组长度(应对函数传参场景)

如果你需要把数组传递给其他函数打印,要注意:数组作为函数参数时会退化为指针,这时候sizeof(my_array)会返回指针的大小(比如64位系统是8字节),用原来的方法计算长度就完全错了。这种情况建议在调用函数时手动传递数组长度:

// 打印数组的函数
void print_str_array(char arr[][20], int arr_len) {
    for(int i = 0; i < arr_len; i++) {
        printf("%s\n", arr[i]);
    }
}

int main() {
    char user_input_array[5][20];
    // 这里省略用户输入填充数组的逻辑
    int len = sizeof(user_input_array) / sizeof(user_input_array[0]);
    // 调用函数时传入数组和长度
    print_str_array(user_input_array, len);
    return 0;
}

2. 用哨兵值标记数组结尾(适合字符串数组)

因为你用%s打印元素,说明是字符串数组,可以在数组最后一个有效元素后面放一个NULL作为“哨兵”,这样不用计算长度,遍历到NULL就停止:

char my_array[10][20];
int input_count = 0;

// 假设这里是用户输入逻辑,每输入一个字符串就存在my_array[input_count],然后input_count++
// ...

// 输入完成后,在最后放一个NULL作为结束标记
my_array[input_count] = NULL;

// 遍历打印,直到遇到NULL
int i = 0;
while(my_array[i] != NULL) {
    printf("%s\n", my_array[i]);
    i++;
}

内容的提问来源于stack exchange,提问作者iraza-n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:45:07