c - 动态内存分配问题

标签 c

谁能告诉我为什么这个程序会给出调试错误消息
“损坏:在 0x00430050 处的正常 block (#42)之后”。 消息在 free(ptr);
线上生成 我想问题与内存的重新分配有关。

#include<stdio.h>
#include<stdlib.h>
#define DELTA 5

void include(int d,int* p,int n,int k,int flag);

void main(void)
{
 int *ptr;     
 int i=0,digit,koef=1;

 ptr=(int *)malloc(DELTA*sizeof(int));  
 fp=fopen("test.txt", "r")) 
 do{    

      fscanf(fp,"%d",&digit);  
      if (!(i % DELTA))
        koef++;
      if(i<(DELTA*koef))
        include(digit,ptr,i,koef,1);
      else
       include(digit,ptr,i,koef,2);
       i++;     
  }

}while(!feof(fp));     

free(ptr);      
}

 void include(int d,int* p,int n,int k,int flag)
 {
    switch(flag){
        case 1: *(p+n)=d;break;
        case 2: if((p=(int *)realloc(p,k*DELTA*sizeof(int)))==NULL){  
               printf("Error!Memory not allocated!\n");
               exit(1);
 }
       *(p+n)=d;break;
 }
}

最佳答案

您正在将 ptr 传递给您的函数,然后使用 realloc 更改它。您需要将指针传递给指针才能使其正常工作。

我建议您在调用 include 之前和之后以及调用 realloc 之前和之后打印出指针指向的地址。这应该向您展示正在发生的事情或查看下面的代码:

#include <stdio.h>

void a( int **ptrptr)
{
    printf("ptrptr = %p,  ptr = %p\n",ptrptr,*ptrptr) ;
    *ptrptr = (int*)realloc(*ptrptr, 10*sizeof(int)) ;
    printf("ptrptr = %p,  ptr = %p\n",ptrptr,*ptrptr) ;
}


int main(int argc, char **argv)
{
    int *ptr = malloc(5*sizeof(int)) ;
    printf("ptr = %p\n",ptr) ;
    a(&ptr) ;
    printf("ptr = %p\n",ptr) ;
    free(ptr) ;
    return 0;
}

关于c - 动态内存分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2200363/

相关文章:

c - 如何使用 OpenSSL 验证由 Jarsigner 创建的 *.SF/*.RSA 签名

c - 素数生成器(spoj)

c - 在聊天应用程序中使用 C 中的 fork 命令

c - Malloc C 中的 3 维数组?

c - 在 C 中,如何将 -o 合并为命令行参数,以将输出写入另一个文件而不是 stdout?

c - IF 语句中定义的 undefined variable 出错

c++ - 如何在 C/C++ 中查找矩阵的数据大小

c - 当 x 为负时,!x 是否等于真?

c - 二维数组的合并

c - 在 C 中打印文件中的 int 数组