2016-06-12 65 views
1

我會擴展數組,直到程序收到「-1」作爲輸入。我每次1當前的陣列延伸,但經過7輸入我有「無效的下一個大小:0x0000000000d47010」Dinamically增長陣列,直到鍵輸入錯誤:無效的下一個尺寸

void extend(int *v, int i) 
{ 
    int *p; 
    p= (int *) realloc(v, (i+1)*sizeof(int)); 
    if(p!=NULL) 
    v=p;  
} 
int main() 
{ 
    int *v; 
    v= malloc(sizeof(int)); 
    int n=0; 
    int i=0; 

    while(n!=-1) 
    { 
    scanf("%d", &n); 
    v[i]=n; 
    extend(v,i); 
    i++; 
    } 
    return 0; 
} 

編輯做這個工作

void extend(int *v, int i) 
{ 
    int *p; 
    p= (int *) realloc(v, (i+1)*sizeof(int)); 
    if(p!=NULL) 
    v=p;  
} 

int main() 
{ 
     int *v; 
     v= malloc(sizeof(int)); 
    int n=0; 
    int i=0; 

     while(n!=-1) 
     { 
     scanf("%d", &n); 
     if(n!=-1) 
     { 
     extend(v,i); 
     v[i]=n; 
     i++; 
     } 
    } 

    prodottoScalare(v, i); 

     return 0; 
} 

回答

1

功能參數是局部變量 可能的解決方案。所以在功能extend在此聲明

v=p; 

有分配的本地變量v是退出函數後銷燬。用作參數的原始指針本身不會被改變。

您需要通過引用將原始指針傳遞給函數。

而且這個while循環

while(n!=-1) 
{ 
scanf("%d", &n); 
v[i]=n; 
extend(v,i); 
i++; 
} 

的邏輯是不正確。由scanf輸入的值可以等於-1或者可以遇到流的結尾。儘管如此,陣列已經擴展。

你也應該釋放所有分配的內存。

考慮到,在C主要不帶參數應該聲明如下

int main(void) 

程序可以看看下面的方式

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

size_t extend(int **a, size_t n, int value) 
{ 
    int *p = realloc(*a, (n + 1) * sizeof(int)); 

    if (p != NULL) 
    { 
     *a = p; 
     (*a)[n++] = value; 
    } 

    return n; 
} 

int main(void) 
{ 
    int *a = NULL; 
    size_t n = 0; 
    int value; 

    while(scanf("%d", &value) == 1 && value != -1) 
    {  
     n = extend(&a, n, value);  
    } 

    for (size_t i = 0; i < n; i++) printf("%d ", a[i]); 
    printf("\n"); 

    free(a); 

    return 0; 
} 

如果進入

0 1 2 3 4 5 6 7 8 9 -1 

則程序輸出看起來像

1 2 3 4 5 6 7 8 9 

另一個函數的實現,可以像

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

_Bool /* or int */ extend(int **a, size_t n) 
{ 
    int *p = realloc(*a, (n + 1) * sizeof(int)); 
    _Bool /* or int */ success = p != NULL; 

    if (success) *a = p; 

    return success; 
} 

int main(void) 
{ 
    int *a = NULL; 
    size_t n = 0; 
    int value; 

    while(scanf("%d", &value) == 1 && value != -1) 
    {  
     if (extend(&a, n)) a[n++] = value;  
    } 

    for (size_t i = 0; i < n; i++) printf("%d ", a[i]); 
    printf("\n"); 

    free(a); 

    return 0; 
} 

的結果將是相同的同一輸入第一個示範項目。

+0

您的解決方案可以工作,我改變了答案,並把一個解決方案,它的工作原理,但它錯了嗎? – user4789408

+0

@ user4789408新解決方案中的函數與通過值而不是參考傳遞原始指針的問題相同:) –

0

注意,函數extend的指針v int *v是按值傳遞,賦值語句v=p不會改變傳遞給函數extend值。因此,參數按引用傳遞這裏int *v

void extend(int *&v, int i) 
{ 
    int *p; 
    p= (int *) realloc(v, (i+1)*sizeof(int)); 
    if(p!=NULL) 
    v=p;  
} 
int main() 
{ 
    int *v; 
    v= malloc(sizeof(int)); 
    int n=0; 
    int i=0; 

    while(n!=-1) 
    { 
    scanf("%d", &n); 
    v[i]=n; 
    extend(v,i); 
    i++; 
    } 
    return 0; 
} 
+0

C中沒有引用類型:) –