【发布时间】:2021-02-16 10:23:49
【问题描述】:
我正在编写一个代码来获取用户的输入,并通过数组将其完全打印出来。
void getArrays(char a[10][10], int b[10], int n ){
printf("Enter number of students and then those students names and scores separated by a space.\n");
scanf("%d", &n);
int i = 0;
while(i < n){
scanf("%s%d", a[i],&b[i]);
i++;
}
}
void printArrays(char a[10][10], int b[10], int n ){
int j;
for(j=0; j<n-1; j++){
printf("%s %d\n", a[j],b[j] );
}
}
在这种情况下,a 是一个 10 行乘 10 列的字符数组,而b 是一个整数数组,大小也是 10 行。 n 是用户在创建数组之前输入的数字,指定数组中的字符串数量。
输入看起来像这样:
5
Jimmy 90
Tony 80
Troy 67
Dona 78
Dylan 97
此时它会切断并打印数组,这可以正常工作。但是,在完成名称打印后,终端会吐出大量数字和随机字符串,然后才给我这个错误:
Segmentation Fault (core dumped)
我通过 gbd 调试器运行它,并收到以下消息:
Program received signal SIGSEGV, Segmentation fault.
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:65
65 ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.
我已经在网站上搜索过这个错误,但已经提出的问题与我的问题无关; Weird Segmentation Fault after printing Segmentation fault core dump 这些只是我见过的两个,它们不是我想要的答案。
我从进一步的搜索中看到,这可能是指针错误,或者是引用数组时代码中的大小差异。我将问题缩小到仅在打印完名称后才发生。所以我尝试将for(j=0; j<n; j++) 更改为for(j=0; j<n-1; j++),它再次给了我同样的问题。
我认为 for 循环可能正在读取我想要的元素数量,即 - 而不是在 3 处停止(如果 n = 3),并且它没有其他要打印的东西,所以它给了我分段错误错误?
在这种情况下,我是否需要使用带有n 的指针,例如&n,还是我的数组大小会出现问题?
调用这些函数的代码如下:
int main(){
char names[10][15]; // can handle up to 10 students
int scores[10];
int num;
int average;
getScores(names, scores, num);
printScores(names, scores, num);
}
【问题讨论】:
-
显示调用
getArrays()和printArrays()的代码。扫描用户输入后,为n添加打印语句,让我知道你得到了什么值。 -
@meaning-matters 既然你提到它,它会打印出 832。我输入了 3。这很可能是个问题。
-
你之前不是发过同样的问题吗?
-
@Barmar 我做了,它被关闭了,因为我猜不够清楚,所以我删除了它并更好地解释了我的问题。
-
你应该编辑它并请求重新打开而不是写一个新问题。
标签: arrays c segmentation-fault gdb