【发布时间】:2016-09-01 01:04:56
【问题描述】:
我想创建一个包含 10 个元素的简单整数数组。 我正在使用动态内存在内存中分配空间,每当我超过该数量时,它将调用 realloc 使其大小翻倍。 每当我输入“q”时,它都会退出循环并打印数组。
我知道我的程序充满了错误,所以请指导我找出错误所在。
/* Simple example of dynamic memory allocation */
/* When array reaches 10 elements, it calls
realloc to double the memory space available */
#include <stdio.h>
#include <stdlib.h>
#define SIZE_ARRAY 10
int main()
{
int *a;
int length=0,i=0,ch;
a= calloc(SIZE_ARRAY, sizeof(int));
if(a == NULL)
{
printf("Not enough space. Allocation failed.\n");
exit(0);
}
printf("Fill up your array: ");
while(1)
{
scanf("%d",&ch);
if(ch == 'q') //possible mistake here
break;
a[length]=ch;
length++;
if(length % 10 == 0) //when length is 10, 20, 30 ..
{
printf("Calling realloc to double size.\n");
a=realloc(a, 2*SIZE_ARRAY*sizeof(int));
}
}
printf("You array is: \n");
for(;i<length;i++)
printf("%d ",a[i]);
return 0;
}
每当我输入“q”时,程序就会崩溃。我是初学者,所以我知道我犯了一个愚蠢的错误。任何帮助将不胜感激。
【问题讨论】:
-
您有多个错误。
a=realloc(a, 2*SIZE_ARRAY*sizeof(int));。那里的大小是常量。这显然不是您想要的,因为每个realloc的大小都应该增加。接下来,scanf("%d",&ch); if(ch == 'q')并没有按照你的想法去做。ch被解析为整数。所以scanf总是会在你输入一个非数字值比如'q'时失败(总是检查scanf的返回值)。 -
顺便说一句,建议您学习使用调试器,以便您自己更有效地发现这些问题。
-
感谢凯勒姆的建议。在您的第一点中,SIZE_ARRAY 宏是常量,但是如果我将常量乘以 2,那么它不会给我两倍的值吗? ....如果我想按字符“q”退出循环,你建议我应该怎么做?我的思绪被阻塞了,似乎无法弄清楚。
-
2*ARRAY_SIZE 是一个常数值吧?这就是大小为 80、80、80、80 等的 realloc。你能看出问题所在吗?大小需要为 80、160、320 等。对于退出,一种选择是检查
scanf的返回值。如果输入是有效数字,它将返回1(已解析的项目数),否则将返回0(未解析项目)。 -
哦,我现在明白你的意思了。我会努力解决的。再次感谢您的帮助。