标题:初学数据结构,大家看一个很简单线性结构的函数
只看楼主
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
结帖率:87.5%
已结贴  问题点数:20 回复次数:10 
初学数据结构,大家看一个很简单线性结构的函数

void Set(i,length,0)
{
    int p[10]={1,2,3,4,5,6,7,8,9,0};                     
    //p=(int *)malloc((LIST_size)*sizeof(int));
    int *p1;
    p1=(int *)realloc(p,(LIST_size+10)*sizeof(int));
    int *p2;
    p2=p1+i-1;
    int *p3;
    for (p3=p1+LIST_size+10-1;p3>=p2;p3--)
        *(p3+1)=*p;
    *p2=0;
    length++;
}

其实就是打算用realloc扩展后,存入传入的第i的数字0,但是程序可以编译,但是提示是realloc出错了 ,大家帮帮忙
搜索更多相关主题的帖子: 初学 函数 线性 数据结构 
2010-03-12 21:32
陈大师
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:231
专家分:1038
注 册:2009-11-4
得分:1 
难道是头文件问题~~~~
#include <iostream>
using namespace std;
加上这个!试试看咯~~~~
2010-03-12 22:01
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:19 
int p[10]={1,2,3,4,5,6,7,8,9,0}; 这个p指向的空间是栈,并且p是一个常量,相当于具有const属性
realloc分配的空间是在栈上的,so。。。用你注释掉了的那段代码int *p=(int *)malloc((LIST_size)*sizeof(int));并用循环给它赋值,再realloc它

2010-03-12 22:21
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
得分:0 
以下是引用ldg628在2010-3-12 22:21:06的发言:

 int p[10]={1,2,3,4,5,6,7,8,9,0}; 这个p指向的空间是栈,并且p是一个常量,相当于具有const属性
realloc分配的空间是在栈上的,so。。。用你注释掉了的那段代码int *p=(int *)malloc((LIST_size)*sizeof(int));并用 ...
恩 可以还说得详细一点吗? p为什么是个常量? 指针常量吗? 有const属性的您所说的常量有哪些呢?
2010-03-12 22:52
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
得分:0 
以下是引用陈大师在2010-3-12 22:01:09的发言:

难道是头文件问题~~~~
#include
using namespace std;
加上这个!试试看咯~~~~
我试了 还是这个问题 估计是楼下那位兄弟说的const属性的问题~~~感谢你第一个回帖,呵呵呵

[ 本帖最后由 jbddd 于 2010-3-13 01:06 编辑 ]
2010-03-12 22:52
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
p是个常量是编译器规定的,一般的数组名都是常量,它们的值是不能改变的,在定义它们时,它们的空间就已经被程序自动分配下来了,并且是固定下来了的,相当于定义一个变量a,它的地址&a也是一个常量,我们是不能改变它的,但我们可以改变它的内容,也就是它的值,指针也一样,我们可以改变它其实也是改变它的内容,然后通过它的内容而间接地访问这个内容所标识的地址,但是存储指针它本身的地址跟其它变量的一样,也是不能改变的
2010-03-12 23:17
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
得分:0 
以下是引用ldg628在2010-3-12 23:17:57的发言:

p是个常量是编译器规定的,一般的数组名都是常量,它们的值是不能改变的,在定义它们时,它们的空间就已经被程序自动分配下来了,并且是固定下来了的,相当于定义一个变量a,它的地址&a也是一个常量,我们是不能改变 ...
realloc不是来先在内存开一块空间,再把p的内容复制过来吗? 也就是返回的是新的内存的空间首地址,不存在去改开始原始的p所含的内容啊?我这里理解的realloc中的p指针只用来起一个引用的作用,不知道是不是?还请多多的指教。。。
2010-03-12 23:27
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
p虽然是一个指针,但它的值是固定了的,它的值就代表了它要指向的空间和它自己,而一般的指针是它的值代表它要指向的空间,但它自己本身是要空间来存储,它是一个变量
数组一般都是在栈上或者数据段上,而realloc申请的空间是在堆上的,realloc操作的是堆上的东西,如果想动态的申请空间,用栈时,在函数返回后栈上的数据就会被冲掉,不会被保留,这与malloc使用的初衷不符,realloc应该会检查地址
realloc是先看看p指向的空间的后面有没有空闲的空间来满足我们的resize,如果有的话,直接在后面扩空间,如果没有的话,就再找
2010-03-12 23:52
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
得分:0 
以下是引用ldg628在2010-3-12 23:52:56的发言:

p虽然是一个指针,但它的值是固定了的,它的值就代表了它要指向的空间和它自己,而一般的指针是它的值代表它要指向的空间,但它自己本身是要空间来存储,它是一个变量
数组一般都是在栈上或者数据段上,而realloc申请 ...
您的意思是realloc直接也只能是操作堆上的数据,然而编译器把p分配配到了除了堆以外的地方,例如说栈和数据段,所以只能把要操作的数据分配到堆,例如开一块内存malloc重新分配在堆上,再用realloc操作是不是?
另外是“如果想动态的申请空间,用栈时,在函数返回后栈上的数据就会被冲掉,不会被保留,这与malloc使用的初衷不符,realloc应该会检查地址
”是什么意思? 初衷指的是什么呢?谢谢了

[ 本帖最后由 jbddd 于 2010-3-13 00:06 编辑 ]
2010-03-13 00:04
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
得分:0 
先汗一个。。。。
如果你想用realloc的话,那它申请来的空间肯定是在堆上的,它的第一个参数也可以是Null,这时就相当于malloc了,你把它的第二个参数设为0,那它就相当于free;
在栈上也是可以动态申请空间的,有专门的一个函数,但函数返回后,它会被自动释放,malloc一族申请的空间需要我们显性地把它释放掉(除非程序退出了,这时整个空间都释放了),否则它是一直存在的,当它太多时,程序会变慢,我们再申请空间也越来越难

这样讲不好描述,反而觉得越讲越深,看下《C专家编程》这本书,上面有挺多这方面的介绍
收到的鲜花
  • jbddd2010-03-13 01:07 送鲜花  1朵   附言:感激耐心的赐教哦~~~
2010-03-13 00:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-299238-1-1.html




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

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