使用C语言ADT创建数组遇逻辑错误,请求排查
C语言ADT数组逻辑错误修正
你的代码存在三个核心逻辑/顺序错误,以下是具体问题和修正方案:
1. 函数调用顺序完全颠倒
在main函数中,你先调用了show(输出数组),再调用setVal(输入数据)。此时数组刚完成内存分配,元素值是malloc返回的未初始化内存(通常为0),所以先输出了两个0,之后才进入输入流程。
修正后的main函数片段:
int main(){ struct myArray marks; createArray(&marks, 10, 2); printf("We are running setVal now\n"); setVal(&marks); // 先输入数据 printf("\nWe are running show now\n"); show(&marks); // 再输出数据 return 0; }
2. setVal函数赋值方向错误
输入数据后,你写了n = a->ptr[i];,这是把数组的当前元素值赋给变量n,完全搞反了赋值逻辑——应该把用户输入的n存储到数组对应的位置。
修正后的setVal函数:
void setVal(struct myArray*a){ int n; int i; for(i=0; i<a->used_size; i++){ printf("Enter element %d - ", i); // 调整提示格式,避免多余换行 scanf("%d",&n); a->ptr[i] = n; // 将输入值存入数组 } }
3. show函数输出格式不符合预期
原show函数将所有元素连续输出,没有换行,导致结果挤在一起。需要在每个元素后添加换行符,匹配预期输出的格式。
修正后的show函数:
void show(struct myArray*a){ int i; for(i=0; i<a->used_size; i++){ printf("%d\n", a->ptr[i]); // 每个元素单独一行输出 } }
完整修正代码
#include<stdio.h> #include<stdlib.h> struct myArray{ int total_size; int used_size; int *ptr; }; void createArray(struct myArray*a, int tsize, int usize){ a->total_size = tsize; a->used_size = usize; a->ptr = (int*)malloc(tsize*sizeof(int)); } void setVal(struct myArray*a){ int n; int i; for(i=0; i<a->used_size; i++){ printf("Enter element %d - ",i); scanf("%d",&n); a->ptr[i] = n; } } void show(struct myArray*a){ int i; for(i=0; i<a->used_size; i++){ printf("%d\n", a->ptr[i]); } } int main(){ struct myArray marks; createArray(&marks, 10, 2); printf("We are running setVal now\n"); setVal(&marks); printf("\nWe are running show now\n"); show(&marks); return 0; }
验证输出(输入1和2时)
We are running setVal now Enter element 0 - 1 Enter element 1 - 2 We are running show now 1 2
内容的提问来源于stack exchange,提问作者a potato
相关产品推荐
相关产品推荐

