免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1993 | 回复: 7
打印 上一主题 下一主题

动态开辟堆的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-17 16:52 |只看该作者 |倒序浏览
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <vector>
using namespace std;

#define MAX_FIELD_NUM 50
#define FETCH_COUNT 50
#define MAX_FIELD_LEN 150

typedef char FIELD_ARRAY[FETCH_COUNT][MAX_FIELD_LEN];
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int i,j;
&nbsp;&nbsp;&nbsp;&nbsp;char ***pStdValueBuff = (char ***)malloc(sizeof(char)*MAX_FIELD_NUM);
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<MAX_FIELD_NUM;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStdValueBuff[i] = (char **)malloc(sizeof(char)*FETCH_COUNT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j=0;j<FETCH_COUNT;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStdValueBuff[i][j] = (char *)malloc(sizeof(char)*MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(pStdValueBuff[i][j],0,MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//char pStdValueBuff[MAX_FIELD_NUM][FETCH_COUNT][MAX_FIELD_LEN];

&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<MAX_FIELD_NUM;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j=0;j<FETCH_COUNT;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d/%d\n",i,j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(pStdValueBuff[i][j],"dafdafdf",MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

按照上述代码中开辟的值大小来做没有问题,但是如果把其中的MAX_FIELD_NUM,FETCH_COUNT,MAX_FIELD_LEN的值赋得太大的时候程序就会在strncpy时dowm掉.为了方便起见我没有添加free语句
大家看看这是为什么

[ 本帖最后由 jiangf 于 2009-9-17 17:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-17 17:08 |只看该作者
  1. pStdValueBuff=
复制代码
语句出现的次数有点多

论坛徽章:
0
3 [报告]
发表于 2009-09-17 17:16 |只看该作者
刚才是代码贴错了,现在又重新上传了代码

论坛徽章:
0
4 [报告]
发表于 2009-09-18 09:55 |只看该作者
申请是否成功没有判断,第二strncpy的第二个参数是一个常量串,如果你把第三个参数弄大了肯定有问题

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
5 [报告]
发表于 2009-09-18 10:14 |只看该作者
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <map>
#include <vector>
using namespace std;

#define MAX_FIELD_NUM 500
#define FETCH_COUNT 500
#define MAX_FIELD_LEN 1500

typedef char FIELD_ARRAY[FETCH_COUNT][MAX_FIELD_LEN];
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int i,j;
&nbsp;&nbsp;&nbsp;&nbsp;char ***pStdValueBuff = (char ***)malloc(sizeof(char*)*MAX_FIELD_NUM);
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<MAX_FIELD_NUM;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStdValueBuff[i] = (char **)malloc(sizeof(char*)*FETCH_COUNT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j=0;j<FETCH_COUNT;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStdValueBuff[i][j] = (char *)malloc(sizeof(char)*MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(pStdValueBuff[i][j] != NULL);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(pStdValueBuff[i][j],0,MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//char pStdValueBuff[MAX_FIELD_NUM][FETCH_COUNT][MAX_FIELD_LEN];


&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<MAX_FIELD_NUM;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j=0;j<FETCH_COUNT;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d/%d\n",i,j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(pStdValueBuff[i][j],"dafdafdf",MAX_FIELD_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}


在linux上测试通过。
在AIX上使用64位编译通过,如果使用32位编译,会报 Illegal instruction(coredump) 的错误。

论坛徽章:
0
6 [报告]
发表于 2009-09-18 10:21 |只看该作者
原帖由 syncpk99 于 2009-9-18 10:14 发表
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define MAX_FIELD_NUM 500
#define FETCH_COUNT 500
#define MAX_FIELD_LEN 1500

typedef char ...

为什么在32位的编译环境下会出错呢,我的编译环境就是用32位的编译器

论坛徽章:
0
7 [报告]
发表于 2009-09-18 10:42 |只看该作者
原帖由 jiangf 于 2009-9-17 16:52 发表
#include
#include
#include
#include
#include
using namespace std;

#define MAX_FIELD_NUM 50
#define FETCH_COUNT 50
#define MAX_FIELD_LEN 150

typedef char FIELD_ARRAY[FETCH_COUNT] ...

1,前两处malloc应该分配sizeof(char *) * n那么多;
2,用pStdValueBuff[j]访问有问题,因为你的程序是链表结构,不是线性数组,应该是
     p = *(pStdValueBuff+i);
     再用*(p + j)去访问真正的字符串。

论坛徽章:
0
8 [报告]
发表于 2009-09-18 14:18 |只看该作者

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <map>
  5. #include <vector>

  6. using namespace std;

  7. #define MAX_FIELD_NUM 50
  8. #define FETCH_COUNT 50
  9. #define MAX_FIELD_LEN 150

  10. typedef char FIELD_ARRAY[FETCH_COUNT][MAX_FIELD_LEN];

  11. int main()
  12. {
  13.     int i,j;

  14.     char ***pStdValueBuff = (char ***)malloc(sizeof(char**)*MAX_FIELD_NUM);
  15.     for(i=0; i<MAX_FIELD_NUM; i++)
  16.     {
  17.         pStdValueBuff[i] = (char **)malloc(sizeof(char*)*FETCH_COUNT);
  18.         for (j=0; j<FETCH_COUNT; j++)
  19.         {
  20.             pStdValueBuff[i][j] = (char *)malloc(sizeof(char)*MAX_FIELD_LEN);
  21.             memset(pStdValueBuff[i][j], 0, MAX_FIELD_LEN);
  22.         }
  23.     }
  24.     //char pStdValueBuff[MAX_FIELD_NUM][FETCH_COUNT][MAX_FIELD_LEN];

  25.     for(i=0; i<MAX_FIELD_NUM; i++)
  26.     {
  27.         for (j=0; j<FETCH_COUNT; j++)
  28.         {
  29.             printf("%d/%d\n",i,j);
  30.             strncpy(pStdValueBuff[i][j], "dafdafdf", MAX_FIELD_LEN);
  31.         }
  32.     }
  33.     return 0;
  34. }

复制代码

[ 本帖最后由 pagx 于 2009-9-18 14:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP