2011-12-28 115 views
1

嗯,我一直在研究C这个冬季假期,在我的冒险中,我偶然发现了一个动态数组问题。将一个值附加到一个动态数组的末尾

这确实是一个相当简单的程序。我正在尝试做的是创建一个包含斐波那契数列的数组。这里是代码:

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

int dynamic_arry_append(int* arry, int* number, int* size); 

int main() { 

    int i, n, size = 3, *arry = NULL, fibarr[size]; 

    printf("Dynamic array, Fibonacci series. \n"); 
    printf("Capture upto element: "); 
    scanf("%d", &n); 

    i = 0; 
    // passing the first elements 
    fibarr[0] = 0; 
    fibarr[1] = 1; 
    fibarr[2] = 1; 

    while (i < n) { 
     printf("**%d\n",fibarr[0]); 
     dynamic_arry_append(arry, &fibarr[0], &size); 
     fibarr[0] = fibarr[1]; 
     fibarr[1] = fibarr[2]; 
     fibarr[2] = fibarr[1] + fibarr[0]; 
     i++; 
    } 

    for (i = 0 ; i < size ; i++) 
     printf("Element %d of the array: %d.\n", i, arry[i]); 

    return 0; 
} 

int dynamic_arry_append(int* arry, int* number, int* size) { 
    int i; 

    int bacon = *size; // first name i thought of 
    bacon++; 
    int *new_addr = realloc(arry, bacon * sizeof(int)); 

    if(new_addr != NULL) { 
     arry = new_addr; 
     arry[bacon-1] = *number; 
     // printf for easier debugging, or so i thought 
     for (i = 0 ; i < bacon ; i++) 
      printf("%d\t%d\n", i+1, arry[i]); 
     printf("\n"); 
     *size = bacon; 
    } else { 
     printf("Error (re)allocating memory."); 
     exit (1); 
    } 

    return 0; 
} 

至少在我的脑海里,这个作品。然而,在实践中,我得到有趣的结果:

Dynamic array, Fibonacci series. 
Capture upto element: 5 
**0 // next fibonacci number 
1  5256368 
2  5246872 
3  1176530273 
4  0 

**1 
1  5256368 
2  5246872 
3  1768053847 
4  977484654 
5  1 

**1 
1  5256368 
2  5246872 
3  1551066476 
4  1919117645 
5  1718580079 
6  1 

**2 
1  5256368 
2  5246872 
3  977484645 
4  1852397404 
5  1937207140 
6  1937339228 
7  2 

**3 
1  5256368 
2  5246872 
3  1551071087 
4  1953724755 
5  842231141 
6  1700943708 
7  977484653 
8  3 

/* Code::Blocks output */ 
Process returned -1073741819 (0xC0000005) execution time : 17.886 s 
Press any key to continue. 

我真的被这个错误困惑,和周围搜索后,我发现无解...谁能帮助?非常感谢你。

+0

什么是错误?它给fibonnaci罚款0 1 1 2 3 5 – 2011-12-28 09:29:15

+0

在你调用'dynamic_arry_append'之前,尝试打印'arry'的值:'printf(“arry的值:%p \ n”,(void *)arry);' – pmg 2011-12-28 09:31:52

+0

@ hermant:是的,但下面的行打印我想要存储的值的数组,这就是程序失败的地方 – rubbyrubber 2011-12-28 09:34:17

回答

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

int * dynamic_array_append(int * array, int size); 

int main() { 

    int i, n, size=0, *array = NULL; 

    printf("Dynamic array, Fibonacci series. \n"); 
    printf("Capture upto element: "); 
    scanf("%d", &n); 

    for (i=0 ; i<n ; i++) 
     array = dynamic_array_append(array, i); 

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

    return 0; 
} 

int * dynamic_array_append(int * array, int size) 
{ 
    int i; 
    int n1, n2; 
    int new_size = size + 1; 
    int * new_addr = (int *) realloc(array, new_size * (int)sizeof(int)); 

    if (new_addr == NULL) { 
     printf("ERROR: unable to realloc memory \n"); 
     return NULL; 
    } 

    if (size == 0 || size == 1) { 
     new_addr[size] = size; 
     return new_addr; 
    } 

    n1 = new_addr[size-1]; 
    n2 = new_addr[size]; 
    new_addr[new_size-1] = new_addr[new_size-2] + new_addr[new_size-3]; 

    return new_addr; 
} 

/* 
Output: 

Dynamic array, Fibonacci series. 
Capture upto element: 10 
array[0] = 0 
array[1] = 1 
array[2] = 1 
array[3] = 2 
array[4] = 3 
array[5] = 5 
array[6] = 8 
array[7] = 13 
array[8] = 21 
array[9] = 34 

*/ 

注意要点:

  • 新(重)阵列分配应返回到main并存储在pointer-to-int(或)通过pointer-to-pointer-to-int并在重新分配后相应地更新一次
  • 不需要fibarr。它不能解决任何问题。您可以不必通过sizenumber。只需发送size,它会选择n-1n-2来计算n
  • 这被认为是highly inefficient。因为如果你知道n那么你可以一次性分配整数的内存并计算fib序列。
+0

你赢了一个互联网先生...我会努力工作,我的方式来了解这是如何工作的......谢谢 – rubbyrubber 2011-12-28 10:27:20

+0

是的,我知道这不是真的有必要,我只是用它来练习处理动态数组。 ..非常感谢你:) – rubbyrubber 2011-12-28 10:29:05

+0

@rubbyrubber酷..享受'C'的精神:) – 2011-12-28 10:32:27

0

您应该声明您的fibarr指针(以不同的名称命名)而不是数组。你应该通过你的dynamic_arry_append该指针的地址,如&fibarr。并且您应该在main中用calloc初始化fibarr。最后,您应该动态更新(并保留并传递)分配数组的大小。

+0

fibarr只用于计算下一个数字,我只需要3个元素...我正在储存在arry中的实际值 – rubbyrubber 2011-12-28 09:41:21

1

问题可能是arry指针变量被通过值传递给函数dynamic_arry_append。这意味着,您对该函数中的arry变量所做的更改不会被该函数以外的任何变量反映。例如:

int *a = NULL; 

someFunc(a); 

// a will still be NULL here no matter what someFunc does to it. 
+0

尝试传递地址时出现编译器错误:warning:从不兼容的指针类型中传递'dynamic_arry_append'的参数1 – rubbyrubber 2011-12-28 09:43:54

+0

这是因为您的函数可能仍然期望'int *',而不是'int * *'。 – dreamlax 2011-12-28 09:48:14

0

您没有返回数组的新地址......而您正在读/写的不是您的内存。与在调试器下的所有错误信息运行程序,你会看到的问题是在这条线:

dynamic_arry_append(arry, &fibarr[0], &size); 
相关问题