#include<stdio.h> int isSushu(int n); int *getAll(); void dayin(int (*arr)[4]); int main() { int (*arr)[4]=getAll(); dayin(arr); return 0; } int isSushu(int n) { if (n < 2) return 0; for (int i = 2; i < n; i++) { if (n % i == 0) return 0; } return 1; } int * getAll() { static int arr[50][4] = {0}; int temp[30] = {0},tc=0,c=0; for (int i = 1; i <= 30; i++) { if (isSushu(i)) temp[tc++] = i; } for (int i = 0; i < tc - 2; i++) { for (int j = i+1; j < tc - 1; j++) { for (int k = j+1; k < tc; k++) { if (isSushu(temp[i] + temp[j] + temp[k])) { arr[c][0] = temp[i] + temp[j] + temp[k]; arr[c][1] = temp[i]; arr[c][2] = temp[j]; arr[c][3] = temp[k]; c++; } } } } return arr; } void dayin(int (*arr)[4]) { //printf("符合条件得一共有%d组,分别是\n",c); for (int i = 0; i < 42; i++) { printf("第%d组和为%d,(%d,%d,%d)\n",i+1,arr[i][0],arr[i][1],arr[i][2],arr[i][3]); } };该程序有什么问题,请改正
时间: 2024-03-20 18:43:24 浏览: 39
字符串函数string.h应用举例.-综合文档
该程序存在两个问题:
1. 在函数getAll()中返回了一个指向静态数组的指针,但是该数组是在函数内部定义的,因此在函数结束后该数组的生命周期已经结束,返回的指针指向的是无效的内存区域,可能会导致程序崩溃。应该将数组定义在函数外部,或者使用动态内存分配来解决该问题。
2. 在函数dayin()中,程序遍历了整个静态数组arr,而数组的大小是50*4,但是实际上只有42组符合条件,因此在输出时会输出一些无效的数据。应该将遍历的范围改为0~41。
修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
int isSushu(int n);
void getAll(int (*arr)[4]);
void dayin(int (*arr)[4]);
int main() {
int arr[42][4] = {0};
getAll(arr);
dayin(arr);
return 0;
}
int isSushu(int n) {
if (n < 2)
return 0;
for (int i = 2; i < n; i++) {
if (n % i == 0)
return 0;
}
return 1;
}
void getAll(int (*arr)[4]) {
int temp[30] = {0}, tc = 0, c = 0;
for (int i = 1; i <= 30; i++) {
if (isSushu(i))
temp[tc++] = i;
}
for (int i = 0; i < tc - 2; i++) {
for (int j = i + 1; j < tc - 1; j++) {
for (int k = j + 1; k < tc; k++) {
if (isSushu(temp[i] + temp[j] + temp[k])) {
arr[c][0] = temp[i] + temp[j] + temp[k];
arr[c][1] = temp[i];
arr[c][2] = temp[j];
arr[c][3] = temp[k];
c++;
}
}
}
}
}
void dayin(int (*arr)[4]) {
printf("符合条件的一共有%d组,分别是\n", 42);
for (int i = 0; i < 42; i++) {
printf("第%d组和为%d,(%d,%d,%d)\n", i + 1, arr[i][0], arr[i][1], arr[i][2], arr[i][3]);
}
}
```
阅读全文