所以这让我很困惑。我有一个二维数组,当我循环打印第一个指针数组时,它没有给我相同的正确信息,但如果我调用每个特定的地方,它会给我正确的信息。
它有很多调试printf
#include <stdio.h>
#include <string.h>
void input_data(char string[2000], int *arr[51]);
double do_math(int *arr);
void print_data(int **arr);
void make_line(int *result, int num, int score, int weight, int late);
int main(){
char input[2000];
char line[100];
int *grade_book[51];
while(fgets(line, sizeof(line), stdin)){
printf("input given: %s", line);
strcat(input, line);
}
printf("input = %s", input);
input_data(input, grade_book);
print_data(grade_book);
return(1);
}
void input_data(char input[2000], int *arr[51]){
int data[4], result[4];
int stat, penalty, drop_num, total, r, num, score, weight, late;
char status, t;
sscanf(input, " %d %d %c %d", &penalty, &drop_num, &status, &total);
stat = 0;
if(status == 'Y'){
stat = 1;
}
printf("penalty: %d, drop_num: %d, status: %c, total = %d\n", penalty, drop_num, status, total);
data[0] = penalty;
data[1] = drop_num;
data[2] = stat;
data[3] = total;
arr[0] = data;
printf("%d %d %d %d", arr[0][0], arr[0][1], arr[0][2], arr[0][3]);
for(r = 1; r < total; r++){
sscanf(input, " %d %c %d %c %d %c %d", &num, &t,
&score, &t, &weight, &t, &late);
make_line(result, num, score, weight, late);
arr[num] = result;
}
}
输出
input given: 10 0 Y
input given: 2
input given: 2, 80, 40, 0
input given: 1, 100, 60, 0
input = 10 0 Y
2
2, 80, 40, 0
1, 100, 60, 0
penalty: 10, drop_num: 0, status: Y, total = 2
10 0 1 2
10 0 1 2
0:10 1:0 2:4196792 3:0
显然在循环中第3次调用是一个指针,但我不清楚它是什么以及为什么它给了我这个输出。
答案 0 :(得分:1)
在input_data()
中,您有:
int data[4], result[4];
接下来是:
arr[0] = data;
和
arr[num] = result;
data
和result
都是自动数组,这意味着它们会在input_data()
返回时被销毁。因此,一旦您的函数返回,您放入arr
的所有指针都会指向无效的位置。
即使它有效,也就是你当前写的方式,arr
除了第一个之外的所有元素都会指向相同的位置,这可能不是你想要的,否则你可能会离开使用2个元素数组,而不是51个元素数组。
相反,您应该为arr
元素动态分配数组以指向。