我写了一个非常基本的程序来从文件中读取非常大的数字并计算连续数字的最大乘积。为了提醒一些C基础知识,我决定用C语言编写。在我的Linux家用机器上,它就像一个魅力。在Visual Studio 2013 Express上,它会抛出一些错误并挂起(可能与内存管理有关)。你有什么线索是怎么回事?
int ch, i = 0, *ptr, count = 0, j;
FILE *f;
int *arr;
//Opening file in read mode
f = fopen("test.txt", "r");
if (f == NULL) {
printf("Error");
return 0;
}
//intial allocation
arr = malloc((count + 1) * sizeof(int));
ptr = arr;
while ((ch = fgetc(f)) != EOF) {
if (ch == 10) {
continue; //exclude new line character
}
*ptr = (ch - 48); //populating array
ptr++;
count++;
arr = realloc(arr, (count + 1) * sizeof(int));
}
int p0 = 1;
int maxp = 1;
//calculating largest product of five consecutive digits
for (i = 0; i < count - 5; i++) {
p0 = 1;
for (j = 0; j < 5; j++) {
p0 *= arr[i + j];
}
if (maxp < p0) {
maxp = p0;
}
}
printf("%d", maxp);
return EXIT_SUCCESS;
答案 0 :(得分:1)
在你的while循环中你每次都重新分配你的缓冲区(BTW完全没效率,但这是另一个故事)。但是你继续使用ptr
指针指向在while循环之前由malloc分配的缓冲区。 realloc函数可能返回与先前分配的指针的地址相同的地址,在这种情况下,您的程序似乎可以正常工作。但是,如果返回的地址不同,则ptr
不再有效,您的程序将无法运行,甚至可能会崩溃。
这应该有效(尽管效率仍然低):
while ((ch = fgetc(f)) != EOF) {
if (ch == 10) {
continue; //exclude new line character
}
arr[count++] = (ch - 48); //populating array
arr = realloc(arr, (count + 1) * sizeof(int));
}