重新分配后显示的值很奇怪

时间:2019-01-20 14:40:57

标签: c malloc

我打电话给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));
    }

}

我想学习一些编码,所以请告诉我我是否做错了什么。

2 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. for(i=0;i<=size;) 
    

    做到这一点

      scanf("%lf",&*(test+i));
    
    在重新分配之前,

    在最后一次迭代中扫描到内存超出分配的内存的一个元素。这样做调用未定义的行为。从现在开始可能会发生任何事情。

  2. 这两行

    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;
}