C编程,realloc后丢失数据

问题描述 投票:0回答:2

我正在尝试获取数字字符串并将其放入

int
数组中。 我不知道我会得到多少个数字,所以我需要使用动态分配。

我使用

malloc
创建了一个数组,并尝试每次在循环内按
+1
调整它的大小。

这是我的代码

void main() 
{

    char *s;
    int *polyNums;
    int count = 0;
    char *token;  
    s = gets();
    polyNums = (int *)malloc(sizeof(int));
    if (polyNums == NULL)
    {
        printf("Could not allocate required memory\n");
        exit(1);
    }
    token = strtok(s, " ");
    while (token != NULL)
    {
        polyNums[count] = *token - '0';
        count++;
        polyNums = realloc(polyNums, count+1);
        token = strtok(NULL, " ");
    }

}

我的问题是,每次执行

realloc
时,所有保存的数字都会消失,如果我的字符串是
"1 2 3"
,那么在循环1中,
polyNums[0]
1
,但在重新分配后我在循环2中丢失了它。有人可以告诉我我哪里出错了吗?

c dynamic-memory-allocation
2个回答
4
投票

您没有为数组分配足够的内存。

int *polyNums;   // Holding integer!
int count = 0;
polyNums = (int *)malloc(sizeof(int)); // enough space for interger. OK!
...
while(...)
{
  polyNums[count] = *token - '0';
  count++;
  polyNums = realloc(polyNums, count+1);  // Not enough space for intergers!
  ...
}

您访问一个保存 int 值的数组,但每个元素只分配 1 个字节。 虽然您的第一个分配可以容纳第一个整数,但您为任何其他数字分配的内存会更少。

polyNums = realloc(polyNums, (count+1)*sizeof(*polyNums));

除此之外:

  • 不要强制转换 malloc 的返回值
  • 不要将 realloc 的返回值直接分配给您的指针。如果返回值为 NULL,您将丢失旧数据。

1
投票

您应该看看指针和资源管理,更具体地说,您应该了解什么是深度复制以及如何重新分配动态内存。

一般来说,您应该为新的较大内存块定义一个临时指针,将所有旧值复制到新的内存位置,然后您可以将临时指针重新分配给初始指针

polyNums
。然后您就可以安全地添加更多新数据。

© www.soinside.com 2019 - 2024. All rights reserved.