调试-求大神~~ c free()结构体指针出错

问题描述

求大神~~ c free()结构体指针出错

本人菜鸟一枚,调试程序时发现下面的程序只要用free()来释放结构体指针就出错,百思不得其解,望大师指正!非常感谢啦!
注:本人用的是VC6.0。自己写的C程序,私心揣测难道是结构体指针特殊一点,或者我释放的方式不对~
补充:C-Free 5.0上选择mingw5调试则没有问题!到底哪里有问题?

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> 

struct Particle{
     int age;
     double money;
     double famly[4];
     };//定义一个结构体变量 

int main()
{    int PM=5,i,j;
     double *ptr=(double *)calloc(PM,sizeof(double));
     struct Particle *swarm=(struct Particle *)calloc(PM,sizeof(struct Particle)); 

     if(swarm==NULL)
     {printf("给swarm申请内存失败!n");
     exit(1);//异常退出
     }
     else printf("给swarm申请内存成功!n");

     for(i=0;i<PM;i++,swarm++) //对结构体指针赋值并输出
     {
     swarm->age=2*i;
     swarm->money=3*i+0.55;
       printf("swarm[%d]: age=%d,money=%lf ",i,swarm->age,swarm->money);
     for(j=0;j<4;j++)
        {swarm->famly[j]=1.5*j;printf("%lf ,",swarm->famly[j]);}
     printf("n");
     }

       printf("n");//对double型数组赋值并输出
     for(i=0;i<PM;i++)
     printf("%lfn",ptr[i]+i*0.5);
     printf("n");

     free(ptr);ptr=0;
     //free(swarm);swarm=NULL;
     //为什么上面语句一添加程序运行就出问题呢??!!而free(ptr)就没问题? 

     printf("nn"); 

}

解决方案

哈哈,我已经解决了!问题果然出在指针上!由于这个语句的存在:
for(i=0;i<PM;i++,swarm++) //对结构体指针赋值并输出
因此,一些列操作后,swarm指向的内存已经不再是定义时分配的内存了(大意如此,我可能表达的不太准确),因此直接free()的话就要出错了。
此时,先要将swarm还原,再free: swarm=swarm-PM;free(swarm);swarm=NULL;
更改后就OK啦!
指针ptr之所以不存在这个问题,是因为ptr类似数组名,指向的内存定义后就固定不变,所以可以直接free().
事实上,我也是用ptr去指代一个double型的数组,用指针的优点是这个数组的大小可以用一个变量num来灵活调整。
此处的swarm我认为是一个结构体数组的指针,(swarm+i)相当于将swarm从定义的位置移动了i的某个整数倍,
指向了结构体数组中的下一个成员的地址。

解决方案二:

我试了你的代码,没问题啊。。。

解决方案三:

你直接运行时没有问题,你把//free(swarm);swarm=NULL; 语句前面的删除了再试试看,我的在vc6.0下运行后报错。

解决方案四:

恩,没关系。前几天出了个苦头,C-Free 5 mingw5环境下辛辛苦苦调试通过的程序,准备生成可执行文件时拿到vc6.0下一运行,一堆错误!
感觉vc6.0对代码的要求比较苛刻。还有就是,C的指针用起来真的要小心,要多看理论,否则太容易出错了~
谢谢啦!

时间: 2024-08-03 20:46:52

调试-求大神~~ c free()结构体指针出错的相关文章

c scanf输入-求大神告知为什么这个运行会出错,说内存不可读

问题描述 求大神告知为什么这个运行会出错,说内存不可读 #include #include int main() { char*s; scanf("%s",s): char ret[56]; return 0; } 解决方案 指针不是字符串本身., 字符串C语言的实现,是字符数组. 一个字符指针(如果指向字符串),通常只不过是字符串的,第一个字符的地址而已. 一个不知道指向哪里的指针,当然不可以作为字符串 ,传递给 scanf 因为 scanf需要的,是一个存储字符串的地方,也就是相当

求大神,oracle创建表空间出错。

问题描述 求大神,oracle创建表空间出错. create tablespace dshabc datafile 'F:orcldshabc.dbf' size 100M autoextend on next 1M maxsize 1000M extent management local 解决方案 检查F:orcl 目录是否存在,如不存在,需要先创建. 解决方案二: Oracle创建表空间并赋权在oracle中创建perfstat表空间oracle创建表空间 解决方案三: 检查F:orcl

调试-求大神指点这段程序为什么一直有错误,真的不知道怎么处理了。。。

问题描述 求大神指点这段程序为什么一直有错误,真的不知道怎么处理了... 程序的要求是线性表的插入和删除 程序如下: #include #include struct node{ int data; node *next; }; node *create_sort(void) { node *p1,*head=0; int a; printf("建立一条有序链表,请输入数据,以-1结束:"); scanf("%d,&a); while (a!=-1){ p1=new

菜鸟跪求大神指教:C#OPC运行出错

问题描述 错误详细描述如下:有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾.**************异常文本**************System.Net.Sockets.SocketException(0x80004005):请求的名称有效并且在数据库中找到,但是它没有相关的正确的数据来被解析.在System.Net.Dns.InternalGetHostByAddress(IPAddressaddress,BooleanincludeIPv6)在System.N

大数据 笛卡尔积-笛卡尔积数据处理问题,求大神指导

问题描述 笛卡尔积数据处理问题,求大神指导 表结构:tableName(cgi,lo,la,derection,city) SQL: SELECT t1.cgi AS s_cgi, t1.lo AS s_lo, t1.derection AS s_derection, t2.cgi AS t_cgi, t2.lo AS t_lo, t2.derection AS t_derection FROM tableName t1, tableName t2 WHERE t1.city = 'GZ' AN

cmake-刚刚接触Cmake,Cmake构建VTK工程时出错求大神解答。

问题描述 刚刚接触Cmake,Cmake构建VTK工程时出错求大神解答. Cmake编译时出错: CMake Error at CMakeLists.txt:11 (target_link_libraries): Cannot specify link libraries for target "TestVTKInstallvtkRendering" which is not built by this project. CMakeLists.txt的内容是: cmake_minimu

从jsp中向servlet传数据库指针的写法不知道对不对,rs是不是可以传过去,求大神指导

问题描述 从jsp中向servlet传数据库指针的写法不知道对不对,rs是不是可以传过去,求大神指导 rs是数据库指针,想在servlet中获取rs数据库指针,不知道这么写对不对

c语言-关于C语言结构体指针类型的强制转换(求大神详细解答)

问题描述 关于C语言结构体指针类型的强制转换(求大神详细解答) #include <iostream> #include <algorithm> using namespace std; typedef struct { string dna; int count; }DNA; DNA dna[101]; **int cmp(const void *a,const void *b) { DNA *aa = (DNA *)a; DNA *bb = (DNA *)b; return a

struct-数组和结构体对齐关系,求大神解决!

问题描述 数组和结构体对齐关系,求大神解决! #include typedef struct { unsigned char a; unsigned char b; unsigned int c; unsigned short d; unsigned int e; } ABC; const unsigned short code1[6] = {0x1607,0x1003,0x1008,0x2001,0x3002,0x4003}; void main(void) { ABC * p = (ABC