Chinaunix

标题: 动态开辟堆的问题 [打印本页]

作者: jiangf    时间: 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 编辑 ]
作者: net_robber    时间: 2009-09-17 17:08
  1. pStdValueBuff=
复制代码
语句出现的次数有点多
作者: jiangf    时间: 2009-09-17 17:16
刚才是代码贴错了,现在又重新上传了代码
作者: lizhenyl    时间: 2009-09-18 09:55
申请是否成功没有判断,第二strncpy的第二个参数是一个常量串,如果你把第三个参数弄大了肯定有问题
作者: syncpk99    时间: 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) 的错误。
作者: jiangf    时间: 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位的编译器

作者: huangwei0413    时间: 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)去访问真正的字符串。
作者: pagx    时间: 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 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2