【问题标题】:Reading values from the memory block which created/mofied malloc realloc?从创建/修改 malloc realloc 的内存块中读取值?
【发布时间】:2014-01-22 08:00:39
【问题描述】:

我问如何从 malloc/realloc 放入内存块的内存中读取值?

我有一个程序,它首先创建 2 个内存块并一直延伸到 32。它工作正常,但为了在 realloc 之后不丢失值,我使用一个名为 koru.Koru 的整数开始我的 scanf 会话。Koru 以 0 开头并且在每个 realloc 中,我将它的数量设为内存总量的一半,所以我希望不会丢失在 realloc 会话之前输入的值,但现在我需要读取我写的内存,所以我会确保我没有覆盖我怎么能这样做?

    #include "stdio.h"
    #include "stdlib.h"
    int main()
    {
      int size=2;
      int* p1;
      int* p2;
      int n;
      p1=(int *)malloc((size*sizeof(int)));
      int b=0;
      int i=0;
      int koru=0;   
      while(size<32) 
 { 
    if(i<size){           
    for(i=koru;i<size;i++)
 {      
    printf("\nEnter value:");
    scanf("%d",p1);
     }
     }
    else if(boyut=i)         
     {  
        size=size*2;    
        p2 = (int*) realloc (p1,size*sizeof(int));
        p1=p2;  
        koru=size/2;
        printf("\nNOt enough size we make it %d also we protect %d that amount of memory"size,koru);
     }
    }    
    return 0;
    }

我想放一个数组[i]=p1;并在while循环之后阅读它会解决问题,但后来我发现它的作弊我不是从内存块中读取,只是从另一个数组中读取,所以这也行不通,有人可以帮我带路吗?

我的程序做了什么:

2 块内存 malloc 取值并填充它 当它填充时,将内存大小乘以 2 realloc 从半数开始阅读,所以它不会重写 继续这个进度,直到达到 32

编辑:简化问题:

while 循环后我在内存中放了很多值,如何读取它们?

我试着这样读,但我得到的只是 0

int counter =0;
while (counter<koru)
{
printf("\n%d",p1[counter]);
counter++;
}
  return 0;
}

使用 malloc 创建内存块并在 32 后使用 realloc 扩展它的正确代码退出 while 循环并从 p1 指针(从内存)写入所有内容,感谢您的帮助。

工作代码如下:

#include "stdio.h"
#include "stdlib.h"
int main()
{
  int boyut=2;
  int* p1;
  int* p2;
  int n;
  p1=(int *)malloc((boyut*sizeof(int)));

  int b=0;
  int i=0;
  int koru=0;

while(boyut<16)
    {
    if(i<boyut){          
        for(i=koru;i<boyut;i++){    
          printf("\nDeğer Girin:");
        scanf("%d", &p1[i]);
     }
}
    else if(boyut=i)        
    {   
     boyut=boyut*2;    
     p2 = (int*) realloc (p1,boyut*sizeof(int));
     p1=p2;   
     koru=boyut/2;
     printf("\nBoyut yetersiz yeni boyutu %d yapıyoruz önceki %d kadar alanı korumaya aldık",boyut,koru);
 }
}
int counter =0;
while (counter<koru)
{
printf("\n%d",p1[counter]);
counter++;
}
  return 0;
} 

【问题讨论】:

  • 请格式化代码,这看起来很糟糕!
  • 稍后我会将我的值转换为英语。
  • 请检查新代码

标签: c memory memory-management


【解决方案1】:

我不确定你在这里问的是什么,但要访问内存中的值,只需将 p1 用作数组。 p1[3] 会给你内存块中的第四个整数。

请务必遵守数组边界。

【讨论】:

  • printf(%d,p1[3]);输出 0 零是工作还是我做错了?
  • 如果我可以从 p1[0-32] 读取,我的问题将得到解决,但它在我编译时给我一个错误请帮助
  • 这是问题所在:scanf("%d",p1);您需要将 scanf 转换为指向整数的指针,然后将其分配给 p1 中的插槽。或者,scanf("%d", &p1[i]);
  • scanf("%d", &p1[i]);这就是我现在想要的,我的测试代码也可以工作了,非常感谢。
【解决方案2】:

额外问题:您甚至没有填充数组,每次输入时都会覆盖第一个元素。

简单的解决方案是完全删除p2 并将p1 视为一个数组:

...
    scanf("%d", &p1[i]);
...

然后阅读:

int n;
for (n=0; n<i; n++)
    printf("%d ", p1[n]);

但是,如果您想使用两个指针而不是数组索引来执行此操作,则需要一个指针来跟踪mallocrealloc 的整个数组,另一个来跟踪当前值的读取位置/写作。

最初数组是空的,所以它们是一样的:

p1 = (int *)malloc(boyut * sizeof(int));
p2 = p1;
...

输入使用读/写指针,每次递增:

...
    scanf("%d", p2++);
...

内存管理使用“base”指针

...
    p1 = (int *)realloc(p1, boyut * sizeof(int));
...

(注意realloc()的返回值必须严格使用临时变量来检查是否失败,否则可能会丢失p1的值)

然后读取我们将读/写指针重置为开始,并迭代:

int n;
p2 = p1;
for (n=0; n<i; n++)
    printf("%d ", *p2++);

【讨论】:

  • 除了我下面的测试代码之外,我提供了我输入的所有数字(在放置 scanf("%d", &p1[i]); 之后)所以我如何“每次覆盖第一个元素输入。” ?它现在工作:D
  • @BugraSezer 原始代码:scanf("%d", p1) 始终覆盖 p1 处的值,该值始终指向数组的开头。 在将该行更改为做正确的事情之后 ;)在我的辩护中,当我开始输入此内容时,编辑和其他 cmets 不存在,这并不奇怪。我很慢。
  • 当然它会覆盖我同意你的观点,上面是正确的,但无论如何谢谢我也给你点......
猜你喜欢
  • 2017-06-15
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2012-03-29
  • 2014-03-25
  • 2016-11-16
相关资源
最近更新 更多