2015-09-16 45 views
0

我需要根據用戶輸入增加2個陣列的長度。我使用下面的代碼。但是輸出與用戶輸入不匹配。在c中動態增加陣列大小

#include<stdio.h>   
    int main() 
    { 
     int i=0, key=0, size[key], time[key]; 

     while (key!=-1) 
     { 
      printf("Insert value for size : "); 
      scanf("%d",&size[i]); 
      printf("Insert value for time : "); 
      scanf("%d",&time[i]); 
      i++; 

      printf("Run again Press-1 or Exit : "); 
      scanf("%d",&key); 
     } 

     int x=0; 
     for (x ; x<i ; x++) 
     { 
      printf("%d %d\n",size[x],time[x]); 
     } 
     return 0; 
    } 

當以下值的用戶輸入

35 4 
    20 3 
    40 1 
    60 7 
    20 8 

然後輸出來這樣

8 4 
    20 3 
    40 1 
    60 7 
    20 8 

如果陣列的長度超過4,時間陣列的最後一個元素將是打印的,第一元件大小數組。 它爲什麼得到這個輸出?

+2

這不是如何工作。如果你想分配一個可調整大小的數組,請查找'realloc()'。 – EOF

+0

你認爲你的代碼的哪一部分是定義這些數組的初始大小,以及這個大小是多少?你認爲什麼部分正在改變這個大小? –

+0

此外,當key爲零時聲明size [key]和time [key],這意味着數組中沒有可用項,它的大小爲零。我希望你的程序崩潰 – JVene

回答

2

讓你開始的東西。

使用realloc()通過指針重新調整內存指針的大小。

#include <stdlib.h>   
#include <stdio.h>   

int main(void) { 
    // Start with NULL and a size of 0 
    int *my_time = NULL; 
    size_t sz = 0; 

    while (!some_exit_condition) { 
    long long ll; 
    printf("Insert value for size : "); 
    if (scanf("%lld", &ll) != 1) { 
     puts("Numeric input missing"); 
     break; 
    } 
    if (ll < 0 || ll > SIZE_MAX) { 
     puts("Size out of range"); 
     break; 
    } 

    sz = (size_t) ll; 
    void *new_ptr = realloc(my_time, sz * sizeof *my_time); 
    if (new_ptr == NULL && sz != 0) { 
     puts("Out of memory"); 
     break; 
    } 
    my_time = new_ptr; 

    // do something with `my_time` and `sz` 

    } 
    // Clean-up 
    free(my_time); 
    my_time = NULL; 
    sz = 0; 

    return 0; 
}