C语言动态分配数组输出末尾元素总返回0.0求代码修正
问题原因
- 数组下标越界:for循环的终止条件是
i < DynArraylen,循环结束后i的值等于数组长度,而C语言数组下标从0开始,最后一个有效元素的下标为DynArraylen - 1,原代码访问DynArray[i]属于越界读取未初始化内存,输出结果异常。 - 命令行参数转换错误:
argv[1]存储的是字符串类型的参数,不能直接强制转为int整数,需要调用atoi()函数完成字符串到数值的转换,原代码的强制转换实际是将字符串的内存地址转为整数,得到的数组长度完全不符合预期。 - 内存检查逻辑错误:
argc==2分支中先操作DynArray[0]再检查malloc返回值,若内存申请失败会直接触发段错误。
修正后代码
#include <stdio.h> #include <stdlib.h> #define last_digit_of_Matrikelnummer 5 int main(int argc, char* argv[]) { int i; int DynArraylen; double* DynArray; if (argc == 1) { DynArraylen = last_digit_of_Matrikelnummer; DynArray = (double*)malloc(DynArraylen * sizeof(double)); // 立刻检查内存申请结果 if (DynArray == NULL) { printf("out of memory\n"); return 1; } DynArray[0] = 0.0; for (i = 1; i < DynArraylen; i++) { DynArray[i] = DynArray[i - 1] + 0.1; } // 访问最后一个有效元素 printf("My last array element is: %.1f\n", DynArray[DynArraylen - 1]); free(DynArray); } else if (argc == 2) { // 字符串转整数 DynArraylen = atoi(argv[1]); DynArray = (double*)malloc(DynArraylen * sizeof(double)); if (DynArray == NULL) { printf("out of memory\n"); return 1; } DynArray[0] = 0.0; for (i = 1; i < DynArraylen; i++) { DynArray[i] = DynArray[i - 1] + 0.1; } printf("My last array element is: %.1f\n", DynArray[DynArraylen - 1]); free(DynArray); } return 0; }
内容的提问来源于stack exchange,提问作者Chang-Min Yu
相关产品推荐
相关产品推荐

