我打电话给malloc
,然后当我显示重新定位的realloc
的值时,我想使用malloc
缩小一半,很少数字显示为0,是正常还是我搞砸了?
double main()
{
double *test;
int size = 10;
int sizes;
int i = 0;
double value;
test = (double*)malloc(size*sizeof(double));
if(test == NULL)
{
printf("ERROR");
return 0;
}
else
{
printf("\nInsert values : \n");
for(i=0;i<=size;)
{
scanf("%lf",&*(test+i));
if(*(test+i)==0.0)
{
break;
}
if(i>=size)
{
size=size+2;
test = realloc(test, size*sizeof(double));
}
i++;
}
}
sizes=size/2;
test = realloc(test, sizes*sizeof(double));
printf("\nSaved values : \n");
for(i=0;i<size;i++)
{
printf("%lf\n",*(test+i));
}
}
我想学习一些编码,所以请告诉我我是否做错了什么。
答案 0 :(得分:0)
这里有两个问题:
此
for(i=0;i<=size;)
做到这一点
scanf("%lf",&*(test+i));
在重新分配之前,在最后一次迭代中扫描到内存超出分配的内存的一个元素。这样做调用未定义的行为。从现在开始可能会发生任何事情。
这两行
sizes=size/2;
test = realloc(test, sizes*sizeof(double));
将有效内存缩小到其一半大小,然后执行此循环
for(i=0;i<size;i++)
{
printf("%lf\n",*(test+i));
}
尝试读取刚刚缩小的下半部分的值。这一半的记忆不再有效。尝试阅读它也会调用未定义的行为。
所以回答您的问题:
或者我搞砸了
是的,即通过调用未定义的行为。不要那样做。
答案 1 :(得分:0)
如果我很了解您停止在EOF或在读取值为0且没有存储0的情况下停止读取值,并且在完成读取后,您希望将分配向量减小到最小大小,在这种情况下:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int size = 10;
double *test = malloc(size*sizeof(double));
if(test == NULL)
{
printf("ERROR");
return 0;
}
else
{
int i = 0;
double value;
printf("\nInsert values : \n");
while ((scanf("%lf",&value) == 1) && (value != 0))
{
if (i >= size) /* == is enough */
{
size += 2; /* I add 2 entries as you */
test = realloc(test, size*sizeof(double));
}
test[i++] = value;
}
/* remove possible extra entry at the end */
if (i != size)
test = realloc(test, i*sizeof(double));
size = i;
printf("\nSaved values : \n");
for(i=0 ;i<size; ++i)
{
printf("%lf\n",test[i]);
}
free(test);
}
return 0;
}