通过循环打印双数组

时间:2014-09-21 23:40:36

标签: c arrays

所以这让我很困惑。我有一个二维数组,当我循环打印第一个指针数组时,它没有给我相同的正确信息,但如果我调用每个特定的地方,它会给我正确的信息。

它有很多调试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次调用是一个指针,但我不清楚它是什么以及为什么它给了我这个输出。

1 个答案:

答案 0 :(得分:1)

input_data()中,您有:

int data[4], result[4];

接下来是:

arr[0] = data;

arr[num] = result;

dataresult都是自动数组,这意味着它们会在input_data()返回时被销毁。因此,一旦您的函数返回,您放入arr的所有指针都会指向无效的位置。

即使它有效,也就是你当前写的方式,arr除了第一个之外的所有元素都会指向相同的位置,这可能不是你想要的,否则你可能会离开使用2个元素数组,而不是51个元素数组。

相反,您应该为arr元素动态分配数组以指向。