Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用realloc扩展malloc占用的内存空间?_C - Fatal编程技术网

使用realloc扩展malloc占用的内存空间?

使用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<

作为学校助理,我需要用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<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