【发布时间】:2014-06-25 20:03:55
【问题描述】:
我正在尝试生成一个随着 while 循环迭代而增大的数组。我知道指针与解决方案有关。请看下面的代码。
#include <stdio.h>
int main () {
int x = 0;
int *F = malloc(sizeof(int)); //I want F to start out as :-
F[0] = 1; // 1 by 1
F[1] = 2; // 1 by 2 such that it increases in size when assigned
int now = 2;
int evenSum = 2;
while (x <= 40000) {
F[now] = F[now-1] + F[now-2];
x = F[now];
if (F[now] % 2)
{
evenSum += F[now];
}
++now;
}
printf("The outcome is %d\n", evenSum);
//free(F);
// Yes this is problem 2 of euler challenge, i already got a working static model
}
提前致谢
编辑 我实际上正在寻找的是所有偶数 fib 的总和,直到 40M 的截止限制。当我在 fib 序列中遇到偶数时,我可以(我第一次做的)求和。这意味着我没有保留一些任意大小的数组。这篇文章的目的是创建一个不断增长的内存,它会不断消耗内存,直到找到答案。 以下是我从给出的精彩答案中得到的代码。
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
struct vector {
size_t size;
int *data;
};
void vector_resize(struct vector *vector, size_t size) {
if (vector->size >= size)
return;
while (vector->size < size)
vector->size *= 2;
vector->data = realloc(vector->data, sizeof(int) * vector->size);
assert(vector->data != NULL);
}
struct vector * vector_init() {
struct vector *vector = malloc(sizeof(*vector));
vector->size = 4;
vector->data = malloc(vector->size * sizeof(int));
return vector;
}
void vector_free(struct vector *vector) {
free(vector->data);
free(vector);
}
void vector_put(struct vector *vector, size_t index, int data) {
vector_resize(vector, index+1);
vector->data[index] = data;;
}
int vector_get(struct vector *vector, size_t index) {
vector_resize(vector, index+1);
return vector->data[index];
}
int main() {
struct vector *vector = vector_init();
int fibNow = 0;
int now = 2;
vector_put(vector, 0, 1);
vector_put(vector, 1, 2);
int evenSum = 2;
while (fibNow <= 4000000) {
fibNow = vector_get(vector, (now-1)) + vector_get(vector, (now-2));
vector_put(vector, now, fibNow);
if (fibNow % 2 == 0) {
evenSum += fibNow;
}
++now;
}
printf("The outcome is %d\n", evenSum);
// vector_put(vector, 0, 5);
// vector_put(vector, 9, 2);
// int i;
// for (i=0; i<10; ++i)
// printf("index 0: %d\n", vector_get(vector, i));
vector_free(vector);
}
【问题讨论】:
-
你可以用
malloc(sizeof(int) * NUMELEMENTS)在堆上分配一个数组。查看realloc为您的扩展数组重新分配足够的空间。 -
使用
realloc,但在这种情况下,您不妨一次性分配整个数组并省去您的麻烦(或者更好的是,只使用几个ints,因为您只需要在任何给定时间跟踪序列中不超过三个数字和当前总和)。 -
我想要内存中的 fib 数字的完整列表,这样我可以在以后操作它们。 40K 以下的 fib 数字的 evenSum 是即时生成的,我不想存储它。
-
关于此代码:int F = malloc(sizeof(int)); //我希望 F 开始为:- F[0] = 1; // 1乘1 F[1] = 2;由于代码仅为 int 分配单个区域,因此 f[1] 正在破坏堆(malloc 从中分配其区域)。因此,代码操作在 'F[1] = 2' 处未定义之后的任何操作都只是运气问题。作为初始修复,建议为至少 3 个 int 的 IE 分配足够的空间 int *F = (int)malloc(sizeof(int)*3);
-
这一行:++now;结果为: F[now] = F[now-1] + F[now-2];逐渐破坏越来越多的堆。
标签: arrays pointers dynamic linked-list malloc