使用realloc扩展malloc占用的内存空间?
作为学校助理,我需要用malloc创建内存块,当内存块满时,它应该用realloc扩展自己。这将在一个infine循环中继续。但是我遇到了分离错误,我认为错误在realloc中,所以有人能告诉我我做错了什么吗使用realloc扩展malloc占用的内存空间?,c,C,作为学校助理,我需要用malloc创建内存块,当内存块满时,它应该用realloc扩展自己。这将在一个infine循环中继续。但是我遇到了分离错误,我认为错误在realloc中,所以有人能告诉我我做错了什么吗 #include "stdio.h" #include "stdlib.h" int main() { int boyut=5; int* dizi; dizi=(int *)malloc((boyut*sizeof(int))); int b=0; while(b<
#include "stdio.h"
#include "stdlib.h"
int main()
{
int boyut=5;
int* dizi;
dizi=(int *)malloc((boyut*sizeof(int)));
int b=0;
while(b<1)
{
if(*dizi<boyut){
scanf("%d",dizi);
dizi++;
}
else if(boyut=*dizi)
{
printf("boyut yetersiz");
dizi = (int*) realloc (dizi,2*sizeof(int));
boyut=*dizi*2;
}
}
return 0;
}
#包括“stdio.h”
#包括“stdlib.h”
int main()
{
int-boyut=5;
int*dizi;
dizi=(int*)malloc((boyut*sizeof(int));
int b=0;
而(b实际上,您重新分配到小于重新分配之前的值。首先为5
(boyut
)整数分配空间,然后仅为两个整数重新分配空间。您需要增加boyut
,并将其作为乘数重新分配
您还需要记住,realloc
可能会失败,在这种情况下,会将dizi
设置为NULL
,使您取消引用NULL
指针,并松开原始指针,因此无法释放它
也
正如BLUEPIXY所指出的,真正的问题是由于未定义的行为。要使realloc
工作,需要传递原始指针。在执行dizi++
之后,您将不再拥有它
另外,当您分配内存时,内容是未初始化的,这意味着它将包含看似随机的数据。因此,在初始化该数据之前执行*dizi
操作也会导致未定义的行为。您可能希望改用,例如。您实际重新分配的空间小于重新分配之前的空间。首先,为分配空间ode>5
(boyut
)整数,然后您只为两个整数重新分配空间。您需要增加boyut
,并将其作为乘数重新分配
您还需要记住,realloc
可能会失败,在这种情况下,会将dizi
设置为NULL
,使您取消引用NULL
指针,并松开原始指针,因此无法释放它
也
正如BLUEPIXY所指出的,真正的问题是由于未定义的行为。要使
realloc
工作,需要传递原始指针。在执行dizi++
之后,您将不再拥有它
此外,当您分配内存时,内容未初始化,这意味着它将包含看似随机的数据。因此,在初始化该数据之前执行
*dizi
,也会导致未定义的行为。您可能希望使用例如。realloc的第二个参数是请求分配的总大小,否t它应该增长的数量。您应该跟踪分配的大小:
size_t size = some_size;
void *ptr = malloc(some_size);
// check for errors
while (some_condition) {
size += some_increment;
void *newptr = realloc(size);
// check for errors
ptr = newptr;
}
realloc
的第二个参数是请求分配的总大小,而不是它应该增长的数量。您应该跟踪分配的大小:
size_t size = some_size;
void *ptr = malloc(some_size);
// check for errors
while (some_condition) {
size += some_increment;
void *newptr = realloc(size);
// check for errors
ptr = newptr;
}
我照你说的做了,但还是犯了同样的错误。代码修改了,我添加了新代码。@BugraSezer很可能是因为
dizi1=dizi;
。我想你的意思是相反的。没有任何改变,我再次修改了代码,请看一看。@BugraSezer阅读了BLUEPIXY的评论。我读了BLUEPIXY的话,但不明白他的意思?我读了听你说,但仍然是相同的错误。代码修改了,我添加了新代码。@BugraSezer很可能是因为dizi1=dizi;
。我想你的意思是相反的。没有任何更改,我再次修改了代码,请看一看。@BugraSezer阅读了BLUEPIXY的评论。我读了BLUEPIXY说的话,但不明白他的意思?你说的是山姆上面的答案,但仍然修改了相同的错误代码请看..你说了同样的事情,上面的答案,但仍然修改了相同的错误代码请看..你有一个调试器吗?使用它,它会告诉你崩溃在哪里,让你检查并遍历函数调用堆栈,检查变量值。*dizi
不初始化直到scanf.和之后,dizi++;
无法realloc。但是我可以在开始时取5个整数,当relloc发生时会出现分段错误。还有其他问题。为什么比较*dizi?你有一个调试器?使用它,它会告诉你崩溃在哪里,让你检查并遍历函数调用堆栈,检查var的值可选项。*dizi
直到扫描后才初始化。dizi++;
之后无法重新定位。但我可以在开始时取5个整数,重新定位时出现分段错误。还有其他问题。为什么要比较*dizi