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
相关产品推荐
相关产品推荐

