2015-06-01 116 views
2

我希望能夠重新分配我的程序在數字中讀取的空間量。 例如在運行時,它應該能夠讀取任何數量的整數,然後打印出來作爲「int數組:(所有輸入)」 這是我到目前爲止已經試過:malloc和整數數組的realloc大小

int main(int argc, char **argv) 
{ 
    int i = 0, n, num; 
    int *A; 

    A = malloc(sizeof(A)); 

    while(scanf("%d",&num) == 1) 
    { 
     A[i] = num; 
     i++; 
    } 

    n = sizeof(A)/sizeof(A[0]); 

    printf("Int Array: "); 
    for (i = 0; i < n; i++) 
    { 
     printf("%d ", A[i]); 
    } 

    return 0; 
} 
+0

'INT A *'是無效的! –

+1

另外,'sizeof A'通常給你4或8,即指針的大小,而不是它指向的數據的大小。 – vsoftco

回答

2

你也可以先預留內存即特定量的:如果用戶輸入10餘項你的realloc的內存另一塊說20個整數 最後10個項目複製到新的塊等上。

size_t block_length = 10; 
size_t current_length = 0; 
int *A = malloc(sizeof(int) * block_length); // to store 10 integer 
if (A == NULL) 
    doNotContinue_AllocationFailure(); 
current_length += block_length; 
// ... input the first ten numbers, check if count numbers is lesser 
// than block_length 
void *ptr; 
ptr = realloc(A, sizeof(int) * (block_length + current_length) 
if (ptr == NULL) 
{ 
    free(A); /* Otherwise a memory leak occurs */ 
    doNotContinue_AllocationFailure(); 
} 
A = ptr; 

// A can now hold up to 20 numbers, and you can input the next 10 numbers 
4

您的代碼一些問題

  1. 語法int A*;是無效的,你的意思是int *A;
  2. 如果你想分配一個元素正確的語法是

    A = malloc(sizeof(*A)); 
    
  3. 在這一行

    n = sizeof(A)/sizeof(A[0]); 
    

    sizeof()操作者給出其是poitner類型的大小,在這種情況下它是一樣

    n = sizeof(void *)/sizeof(int); 
    

    其可以是21

可以靜態設置數組的大小,在這種情況下,我會建議避免malloc(),或者您可以要求用戶在任何情況下,你不能從指針獲得大小,所以你必須存儲,例如

if (scanf("%d", &size) != 1) 
    return -1; 

A = malloc(size * sizeof(*A)); 
if (A == NULL) 
    return -1; 
/* proceed to work with `A' and keep `size' somewhere, you need it */ 
free(A); 
+0

哦,那麼它不可能改變用戶輸入的大小?所以你必須事先詢問用戶或設定一個尺寸? – Kyuu

+0

以及如果我要事先設置大小,我將如何使用realloc將其限制爲用戶輸入的元素數量。所以我可以打印出每個int,例如(for(i = 0; i Kyuu

0

一招是在每個新輸入中重新分配內存。

int indefiniteInput() { 

    int num; 
    int index = 0; 
    int *inputs = malloc(sizeof (int)); 

    if (inputs == NULL) { 
     perror("malloc failed!"); 
     return -1; 
    } 

    printf("Input numbers: "); 

    while(scanf("%d", &num) == 1) { 

     // stops getting inputs when -1 is entered, 
     // you can change it to any value you want 
     if (num == -1) 
      break; 

     // reallocates memory for the input 
     int *temp = realloc(inputs, sizeof (int) * (index + 1)); 

     if (temp == NULL) { 
      free(inputs); 
      perror("realloc failed!"); 
      return -1; 
     } 

     inputs = temp; 

     // adds the last input to reallocated memory 
     inputs[index++] = num; 
    } 

    printf("Stored inputs: "); 

    int i = 0; 
    for (; i < index; i++) 
     printf("%d ", inputs[i]); 

    free(inputs); 
    return 0; 
} 

輸出:

Input numbers: 5 6 7 8 9 -1 
Stored inputs: 5 6 7 8 9 -1 

Input numbers: 1 2 3 5 -5 -6 89 256 2001 45600 96 33 369 -1 
Stored inputs: 1 2 3 5 -5 -6 89 256 2001 45600 96 33 369 
+0

@rpattiso謝謝你指出。 – raymelfrancisco

+0

不要使用'realloc()'!並且總是認爲會發生更糟糕的情況,所以你可以防止不被阻止,就像'malloc()'可能返回NULL一樣。 –