前两天曾经贴过一个帖子(http://expert.csdn.net/Expert/TopicView1.asp?id=2026605),可是回应的人很少,我觉得这是一个很应该讨论以下的问题:
直接用malloc创建数组:我这样测试过:
int *a;
a = malloc(4*sizeof(int));
a[0] = 0;a[1] = 1;a[2] = 2; a[3] = 3;
这样创建的数组a行为正常,没有什么问题可是请看这段代码:
这是定义
typedef struct
{
int nMath, nEng, nComp;
char *szNum, *szName;
} STUDENTRECORD, *PSTUDENTRECORD;/* The node type of the record struct list */
typedef struct tagSTUDENTRECORDLIST
{
STUDENTRECORD sr;
struct tagSTUDENTRECORDLIST *pNext;
} STUDENTRECORDLIST, *PSTUDENTRECORDLIST;BOOL SRList_CopyToArray(const PSTUDENTRECORDLIST srlistHead, const PSTUDENTRECORDLIST srlistTail, PSTUDENTRECORD *pasr, int cList){
int i = 0;
PSTUDENTRECORDLIST srlistTemp = srlistHead;
*pasr = alloc(cList * sizeof(STUDENTRECORD));
if (!*pasr) return TRUE; /* Memory not enough */ while (srlistTemp)
{
(*pasr)[i] = srlistTemp->sr;
i++;
srlistTemp = srlistTemp->pNext;
}; for (i = 0; i < cList; i++)
printf("%s\n", ((*pasr)[i]).szNum); return FALSE;
}
其中pasr是指向STUDENTRECORD数组的指针,为什么这段程序运行时会有内存访问违规?
而且更奇怪的是,创建的数组在(*pasr)[1]到(*pasr)[4]是正常的数据,但是对(*pasr)[0]的访问会导致内存访问违规,在tc和vc下有一样的结果(当然tc不会有内存保护,打印(*pasr)[0]的内容是乱码)
请大家讨论一下这种情况,难道编译器在处理数组时还有什么特殊手段?另外,编译器如何知道一个数组的大小?会不会在数组结尾有\0?或者像Pascal中那样在字符串的第一个字节保存数组的长度?
直接用malloc创建数组:我这样测试过:
int *a;
a = malloc(4*sizeof(int));
a[0] = 0;a[1] = 1;a[2] = 2; a[3] = 3;
这样创建的数组a行为正常,没有什么问题可是请看这段代码:
这是定义
typedef struct
{
int nMath, nEng, nComp;
char *szNum, *szName;
} STUDENTRECORD, *PSTUDENTRECORD;/* The node type of the record struct list */
typedef struct tagSTUDENTRECORDLIST
{
STUDENTRECORD sr;
struct tagSTUDENTRECORDLIST *pNext;
} STUDENTRECORDLIST, *PSTUDENTRECORDLIST;BOOL SRList_CopyToArray(const PSTUDENTRECORDLIST srlistHead, const PSTUDENTRECORDLIST srlistTail, PSTUDENTRECORD *pasr, int cList){
int i = 0;
PSTUDENTRECORDLIST srlistTemp = srlistHead;
*pasr = alloc(cList * sizeof(STUDENTRECORD));
if (!*pasr) return TRUE; /* Memory not enough */ while (srlistTemp)
{
(*pasr)[i] = srlistTemp->sr;
i++;
srlistTemp = srlistTemp->pNext;
}; for (i = 0; i < cList; i++)
printf("%s\n", ((*pasr)[i]).szNum); return FALSE;
}
其中pasr是指向STUDENTRECORD数组的指针,为什么这段程序运行时会有内存访问违规?
而且更奇怪的是,创建的数组在(*pasr)[1]到(*pasr)[4]是正常的数据,但是对(*pasr)[0]的访问会导致内存访问违规,在tc和vc下有一样的结果(当然tc不会有内存保护,打印(*pasr)[0]的内容是乱码)
请大家讨论一下这种情况,难道编译器在处理数组时还有什么特殊手段?另外,编译器如何知道一个数组的大小?会不会在数组结尾有\0?或者像Pascal中那样在字符串的第一个字节保存数组的长度?
解决方案 »
- csdn撰写博客排版问题--请经常CSDN发博的大神指点高招
- 各位大大,为什么Listcontrol控件的背景图贴上后会出现白线?
- 做了一个网页用的控件,但是把包含该控件的页面关闭后浏览器就自动关闭
- 急需压缩算法 range coding 的资料和论文资料!!!谁能帮帮忙啊?
- 如何在预编译中根据不同操作系统,包含不同的头文件
- 怎么实现分割条移动的时候就让窗口随之变化,而不是等鼠标松开的时候才变化。
- 帮助文档那里只能写下比较短的软件说明,如果我要写比较长的,应该怎么办?
- 求计算不规则图形面积算法!请教高手!在线等待!!!
- 求救!!!wince下连接数据库不能打开记录集
- 请问DLL 的 DEF文件有什么作用?好象不用也行
- 如何在scrollview中的鼠标左键响应的时候画一个自定义的图
- 游戏散分!成语接龙,我将随机抽取5个幸运者,0点结贴!来的越多,机会越大!
也就是说,对于我们来说malloc不单是分配空间,而且分配的时候是有类型的*pasr = alloc(cList * sizeof(STUDENTRECORD)); //原来的代码pasr = (PSTUDENTRECORD *)alloc(cList * sizeof(STUDENTRECORD)); //现在的代码
*pasr = malloc(cList * sizeof(STUDENTRECORD));
这里会报错,malloc分配返回的是 void指针,这点没说头。
你要用某种指针去引用的话,就应该转换类型。
所以应该是
*pasr = (PSTUDENTRECORD *)alloc(cList * sizeof(STUDENTRECORD));
才对。
另,把你的调用代码贴出来。我试试,我想应该不会有这种问题的。
内存违规通常都是超界了,
这一句我没读懂,(*pasr)[i] = srlistTemp->sr;
(*pasr)[i] 应该是一个STUDENTRECORD结构,怎么你会这样赋值!
(*pasr)[i] 是一个STUDENTRECORD结构,srlistTemp是PSTUDENTRECORDLIST结构
而PSTUDENTRECORDLIST结构中的sr字段是STUDENTRECORD类型,所以可以这样负值呀!SeainBlue(爱海) :我去试试