realloc() 没有赋值问题

hat*_*enn 1 c realloc dynamic-memory-allocation

我的一个同学给我发了一个代码,问我怎么了。它是这样的:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *d_array, number, divisor_count, i, size = 1;
    char answer;

    d_array = (int*) malloc(size * sizeof(int));

    do
    {
        printf("\nEnter a number:  ");
        scanf("%d", &number);
        divisor_count = 0;
        for(i = 2; i < number; i++)
            if (number % i == 0) divisor_count++;
        if(divisor_count == 0)
        {
            realloc(d_array,(size + 1) * sizeof(int));
            d_array[size - 1] = number;
            size++;
        }
        printf("\nIs there another number? y/n ");
        getchar();
        answer = getchar();
    } while (answer == 'y');

    for(i = 0; i < size - 1; i++)
        printf("\n%d", d_array[i]);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

它应该从用户那里获取数字并保留质数并在最后打印它们。我电脑上的输出是这样的:

Enter a number:  3
Is there another number? y/n y
Enter a number:  5
Is there another number? y/n y
Enter a number:  8
Is there another number? y/n y
Enter a number:  7
Is there another number? y/n y
Enter a number:  2
Is there another number? y/n n
4072680
5
7
2
Run Code Online (Sandbox Code Playgroud)

代码中还有其他东西,但最大的问题显然是没有分配 realloc() 的返回值。但奇怪的是,这是我的问题,为什么这段代码显示第一个素数错误而其他素数正确?动态数组的地址可能会改变,但为什么第二个和其余的都是正确的,而不是第一个?

编辑:好的,我问这个的原因是试图理解这段代码中 realloc() 的行为,如果你有好的资源请分享。重新分配内存时(释放旧内存时), realloc() 是否更改了旧内存位置的内容?

Jör*_*son 5

总是这样做:

void* new_ptr = realloc(ptr, new_size);
if(!new_ptr) error("Out of memory");
ptr = new_ptr;
Run Code Online (Sandbox Code Playgroud)

原因是它realloc()可能无法在已经分配的块中容纳请求的大小。 如果它需要移动到另一个内存块,它将从您之前分配的内存中复制数据,释放旧的内存块,然后返回新的。

此外,如果 realloc() 返回 NULL,则意味着它失败了。在这种情况下,您的 ptr 指向的内存必须在某个时候被释放,否则您将发生内存泄漏。换句话说,永远不要这样做:

ptr = realloc(ptr, new_size);
Run Code Online (Sandbox Code Playgroud)