C语言动态分配int数组报错求助:命令行参数转存失败
问题分析与代码修正
嗨,我来帮你排查这段代码的问题~你的核心问题出在指针的解引用与偏移操作上,还有一处可以简化的冗余代码,我一步步给你拆解:
1. 指针操作的核心错误
你写的 **(a + i - 2) 是错误的:
a是int**类型(指向int指针的指针),a + i -2会按照int*的字节大小偏移地址,而不是你想要的数组元素(int)的字节大小,这会导致内存访问越界或者赋值到错误的位置。- 正确的做法是先解引用
a得到动态分配的数组首地址(int*类型),再对这个首地址进行索引偏移,比如用(*a)[i-2]或者*(*a + i - 2)都可以。
2. 不必要的字符串复制
你用 strcpy 把 argv[i] 复制到 temp 里再转整数完全是冗余操作,atoi 可以直接接收 argv[i] 这个字符串指针,直接用 atoi(argv[i]) 就能完成转换,能大幅简化代码。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void read(int **a, int argc, char *argv[]) { int i; // 分配对应大小的内存,argc-2是要存储的整数个数 if((*a = malloc(sizeof(int) * (argc - 2))) == NULL){ fprintf(stderr, "Memory allocation failed.\n"); exit(-1); } for (i = 2; i < argc; i++){ // 正确的数组元素赋值方式 (*a)[i - 2] = atoi(argv[i]); } } // 可选:添加测试用的主函数验证功能 int main(int argc, char *argv[]) { int *arr = NULL; // 先做参数合法性检查 if (argc < 3) { fprintf(stderr, "Usage: %s <filename> <num1> <num2> ...\n", argv[0]); return 1; } read(&arr, argc, argv); // 打印验证结果 for (int i = 0; i < argc-2; i++) { printf("arr[%d] = %d\n", i, arr[i]); } free(arr); // 记得释放动态分配的内存,避免泄漏 return 0; }
额外注意事项
- 一定要记得在使用完动态分配的数组后调用
free释放内存,避免内存泄漏。 - 建议添加参数合法性检查(比如判断
argc是否大于等于3),防止用户输入参数不足时出现非法内存访问。
内容的提问来源于stack exchange,提问作者Antonino DG
相关产品推荐
相关产品推荐

