| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 599 人关注过本帖
标题:[求助]关于内存分配的问题
只看楼主 加入收藏
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
 问题点数:0 回复次数:8 
[求助]关于内存分配的问题
#include<stdio.h>
//#include<malloc.h>
#include<stdlib.h>
#define ADDLIST 10
#define LIST_INIT_SIZE 100
typedef struct
{
        int *p;
        int length;       //表的长度
        int listsize;     // 表的实际大小
}*SqList;
void creatSqList(SqList r,int n)
{
     int i;
     int *q;
     r->length = 0;
     r->p = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
     q = r->p;
     if(r->p == NULL) exit(0);  //fail to assign storage
     for(i=0;i<n;i++)
     {
        printf("输入第%d个值:",i);
        scanf("%d",(r->p)++);
        r->length++;
     }
     r->p = q;
     r->listsize = LIST_INIT_SIZE; //assign size(at the begin)
}
/*void uniteSqList(SqList r1,SqList r2,SqList r3)
{
     int r1_last,r2_last;
     r3->listsize = r3->length = r1->length + r2->length;
     r3->p = (int *)malloc(r3->listsize*sizeof(int));
     if(r3->p==NULL)
     {
        printf("存储分配失败!");
        exit(0);
     }
     r1_last = r1->p+r1->length - 1;
     r2_last = r2->p+r2->length - 1;
     while(r1->p<=r1_last && r2->p<=r2_last)     //归并
     {
          if(*(r1->p)<*(r2->p))   *(r3->p)++ = *(r1->p)++;
          else  *(r3->p)++ = *(r2->p)++;
     }
     while(r1->p<=r1_last)     //insert the rest of element of r1
        *(r3->p++) = *r1->p++;
     while(r2->p<=r2_last)     //insert the rest of element of r1
        *(r3->p++) = *r2->p++;
}*/
void outputSqList(SqList r)
{
       int i;
       for(i=0;i<r->length;i++,r->p++)
       printf("%d",*r->p);
}
void destroyList(SqList r)
{
   free(r->p);
}
//此例子只能输入2个有序递增的元素
int main()
{
      SqList r1,r2,r3;
      int n = 4; // size
      printf("创建第一个线性表:\n");
      creatSqList(r1,n); //n是线性顺序表的长度
      outputSqList(r1);
      printf("创建第二个线性表:\n");
      //creatSqList(r2,n); //n是线性顺序表的长度
      //uniteSqList(r1,r2,r3);
      outputSqList(r1);
      printf("\n");
      //outputSqList(r2);
      printf("\n");
      //outputSqList(r3);
      printf("\n");
      //destroyList(r1);
      //destroyList(r2);
      //destroyList(r3);
      system("pause");
      return 0;
}
//  是不是 malloc 只能一次分配连续的内存, 多次分配就乱了地址呢?
有什么好的方法解决吗
搜索更多相关主题的帖子: 内存 
2005-09-07 13:06
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
// try it
#include<stdio.h>
//#include<malloc.h>
#include<stdlib.h>
#define ADDLIST 10
#define LIST_INIT_SIZE 100

typedef struct
{
    int * p;
    int length;       //±íµÄ³¤¶È
    int listsize;     // ±íµÄʵ¼Ê´óС
}SqList;

void creatSqList(SqList & r,int n)
{
    int i;
    int * q;
  r.length = 0;
  r.p = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
    q = r.p;
    if(r.p == NULL)
        exit(0);  //fail to assign storage
    for(i=0;i<n;i++)
    {
        printf("ÊäÈëµÚ%d¸öÖµ:",i);
    scanf("%d",(r.p)++);
    r.length++;
    }
    r.p = q;
    r.listsize = LIST_INIT_SIZE; //assign size(at the begin)
}
void uniteSqList(SqList & r1, SqList & r2, SqList & r3)
{
    int i = 0;
    int * temp1 = r1.p;
    int * temp2 = r2.p;
    int * temp3 = NULL;
    int * end1 = r1.p + r1.length - 1;
    int * end2 = r2.p + r2.length - 1;

  r3.listsize = r3.length = r1.length + r2.length;
  r3.p = (int *)malloc(r3.listsize*sizeof(int));
  if(r3.p==NULL)
  {
        printf("´æ´¢·ÖÅäʧ°Ü!");
    exit(0);
  }
    temp3 = r3.p;
    for( ; i<r3.listsize; i++)
    {
        if(temp1 == NULL)
        {
            *temp3 = *temp2;
            temp3++;
            temp2++;
        }
        else if(temp2 == NULL)
        {
            *temp3 = *temp1;
            temp3++;
            temp1++;
        }
        else if(*temp1 < *temp2)
        {
            *temp3++ = *temp1;
            if(temp1 != end1)
                temp1++;
            else
                temp1 = NULL;
        }
        else
        {
            *temp3++ = *temp2;
            if(temp2 != end2)
                temp2++;
            else
                temp2 = NULL;
        }
    }
}

void outputSqList(const SqList & r)
{
    int i;
    int * temp = r.p;
    for(i=0; i<r.length; i++, (temp)++)
        printf("%d", *(temp));
}

void destroyList(SqList r)
{
   free(r.p);
}

//´ËÀý×ÓÖ»ÄÜÊäÈë2¸öÓÐÐòµÝÔöµÄÔªËØ
int main()
{
    SqList r1,r2,r3;
    int n = 4; // size
    printf("´´½¨µÚÒ»¸öÏßÐÔ±í:\n");
    creatSqList(r1,n); //nÊÇÏßÐÔ˳Ðò±íµÄ³¤¶È
    outputSqList(r1);
    printf("´´½¨µÚ¶þ¸öÏßÐÔ±í:\n");
  
    creatSqList(r2,n); //nÊÇÏßÐÔ˳Ðò±íµÄ³¤¶È
    uniteSqList(r1,r2,r3);
    outputSqList(r1);
    printf("\n");
  
    outputSqList(r2);
    printf("\n");
    outputSqList(r3);
    printf("\n");

    destroyList(r1);
    destroyList(r2);
    destroyList(r3);
    system("pause");
    return 0;
}

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-07 21:03
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
能解释一下
typedef struct
{
        int *p;
        int length;       //表的长度
        int listsize;     // 表的实际大小
}*SqList

typedef struct
{
        int *p;
        int length;       //表的长度
        int listsize;     // 表的实际大小
}SqList           
的不同吗,  是不是加了*在sqlist前面, r1,r2就是相同的地址呢?

2005-09-09 09:53
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
我用.NET调试了,*SqList的r1,r2居然是同一个地址。(执行输入r1后就异常结束)
但是别人说SqList里的r1,r2不是同一个地址, (可以输入2个表)
结构体里有指针啊,如果不用,*SqList, 那要用指向指针的指针怎么解决?(我知道用引用可以解决)
你的代码有些乱码,我不能直接拿去编译,而且源程序我也删除了, 弄了C++版本的。
 我只是想知道其中的原理, 请赐教

2005-09-09 10:00
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
你的代码用中文作为注解,我从论坛上copy 下来,然后放到VC里去, 再从VC里copy 出来,再放到论坛上来的时候,原来中文的地方就乱码了。
我一般写程序不用中文来注解的, 所有都是英文,如果你也写英文,那也会方便我很多。
我现在在学校的普通机房,没有编译器,不能运行代码,所以只能凭经验来回答你的问题了,如有不对请指正。

回答你3楼的问题
第一个 struct 为指针型定义, 也就是说, 如果你在 main 中 定义它的变量那么那个变量为一个指针,一个野指针。你要用 new 为其真正开辟空间。
而第二个 struct 为普通型定义,或实物性定义, 也就是说, 如果你在main 中定义它的变量时,也同时伴随着对它开辟了空间,这个实体已经存在了。
所以你看到了, 第二种定义简单而完全,我一般不用指针型定义。

如果你想要第一种定义的代码,我回去写了后贴上来。

你的问题: r1,r2就是相同的地址呢?
回答,是否为相同地址取决于你的代码, 与是否为指针型定义无关, 关键的是你要用 new 为其开辟空间,否则它是个野指针。这就是程序中异常出现的原因。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-09 18:11
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#define ADDLIST 10
#define LIST_INIT_SIZE 100

struct SqList
{
  int * p;
  int length;       //length of list
  int listsize;     //size of list
};

void creatSqList(SqList * r,int n)
{
  int i;
  int * q;
  r->length = 0;
  r->p = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
  q = r->p;
  if(r->p == NULL)
    exit(1);  //fail to assign storage
  for(i=0;i<n;i++)
  {
    printf("输入第%d个值:",i);
    scanf("%d",(r->p)++);
    r->length++;
  }
  r->p = q;
  r->listsize = LIST_INIT_SIZE; //assign size(at the begin)
}

void uniteSqList(SqList * r1, SqList * r2, SqList * r3)
{
  int i = 0;
  int * temp1 = r1->p;
  int * temp2 = r2->p;
  int * temp3 = NULL;
  int * end1 = r1->p + r1->length - 1;
  int * end2 = r2->p + r2->length - 1;

  r3->listsize = r3->length = r1->length + r2->length;
  r3->p = (int *)malloc(r3->listsize*sizeof(int));
  if(r3->p==NULL)
  {
    printf("存储分配失败!");
    exit(1);
  }
  temp3 = r3->p;
  for( ; i<r3->listsize; i++)   //归并
  {
    if(temp1 == NULL)
    {
      *temp3 = *temp2;
      temp3++;
      temp2++;
    }
    else if(temp2 == NULL)
    {
      *temp3 = *temp1;
      temp3++;
      temp1++;
    }
    else if(*temp1 < *temp2)
    {
      *temp3++ = *temp1;
      if(temp1 != end1)
    temp1++;
      else
        temp1 = NULL;
    }
    else
    {
      *temp3++ = *temp2;
      if(temp2 != end2)
    temp2++;
      else
    temp2 = NULL;
    }
  }
}

void outputSqList(const SqList * r)
{
  int i;
  int * temp = r->p;
  for(i=0; i<r->length; i++, (temp)++)
    printf("%d", *(temp));
}

void destroyList(SqList * r)
{
  if(r)
  {
    free(r->p);
    free(r);
  }
}

//此例子只能输入2个有序递增的元素
int main()
{
  SqList * r1, * r2, * r3;
  r1 = (SqList *)malloc(sizeof(SqList));
  r2 = (SqList *)malloc(sizeof(SqList));
  r3 = (SqList *)malloc(sizeof(SqList));
  
  int n = 4; // size
  printf("创建第一个线性表:\n");
  creatSqList(r1,n); //n是线性顺序表的长度
  outputSqList(r1);
  printf("创建第二个线性表:\n");
  creatSqList(r2,n); //n是线性顺序表的长度

  uniteSqList(r1,r2,r3);
  outputSqList(r1);
  printf("\n");
  
  outputSqList(r2);
  printf("\n");
  outputSqList(r3);
  printf("\n");

  destroyList(r1);
  destroyList(r2);
  destroyList(r3);
  
  system("pause");
  return 0;
}

// 我将你的那个struct 改成了常见的写法,如果按你的那个写法,编译无法通过。原因何在,我也不得而知了,
// 但通常,如果是采用 typedef, 都是采用的我的2楼的那个写法。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-09 23:10
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
指向指针的指针,就可以了

2005-09-10 10:23
zorro2zzz
Rank: 1
等 级:新手上路
威 望:1
帖 子:96
专家分:0
注 册:2005-9-11
收藏
得分:0 
对指向指针的指针有什么要求么?

编程是啥东西,让俺瞧瞧……
2005-09-12 00:55
zorro2zzz
Rank: 1
等 级:新手上路
威 望:1
帖 子:96
专家分:0
注 册:2005-9-11
收藏
得分:0 
使用指针应该有很多问题要注意的吧……

[此贴子已经被作者于2005-9-12 9:42:33编辑过]



编程是啥东西,让俺瞧瞧……
2005-09-12 09:35
快速回复:[求助]关于内存分配的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022082 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved