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() 是否更改了旧内存位置的内容?
总是这样做:
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)