堆栈的复制函数应该怎样写(用C++)?

堆栈的复制函数应该怎样写(用C++)?,第1张

同学, 首先 我想说一下根据你这段代码 我感觉 top 按照字面意思 也是这么理解的 代表 最顶端的元素 我想 你也是这么理解的 但是很遗憾 我感觉 你的逻辑出现了混乱 我 本以为你可能写了双向链表 但 你的代码告诉我你确实写的单向链表 但是 你却付给 top双层含义 即代表 最后 也代表最前
current = current->link;这句代码让我感觉很奇怪 other的top 如果是顶端元素
它的link 应该是空的 双向链表吗 好像你写的不是双向链表
可是从你的代码来看他不是空的 你用它 来把other 给copy 那么 就有一种可能
other 中的 top 和 你下面写的top 一个代表底端 一个代表 最顶端
这个 差错 正好导致 输出结果 的 一正一反
好了不多说了 我改了一下 希望 能对 希望能对
那我就 大胆的 改一下你的代码 希望 是对的 因为 你只提供部分代码 我无法编译 试验 希望成功
newNode = new Node<Type>;
newNode->info = current->info;
top->link = newNode; //呵呵 也就 这句被颠倒一下 而已试试看 对否
top = newNode;
current = current->link;

1、栈区的使用

栈区写入内存的的顺序是先进后出。

存放的是函数的参数、返回值、局部变量

由编译器管理数据开辟和释放

变量的生命周期在该函数结束后自动释放

不要返回局部变量的值,因为局部变量在函数执行之后就释放掉了,无法读取原来的内存

2、堆区的使用

堆区的空间远远大于栈区

它没有先进后出的数据结构

由程序员手动开辟和释放,malloc、calloc开辟free释放

注意:

如果主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中的指针分配内存

3数据区放的是静态变量、全局变量以及常量

static静态变量: 编译阶段分配内存,只能在当前文件内使用,只初始化一次

ertern全局变量:C语言下默认的全局变量前都默认隐藏了该关键字

4const修饰的变量

直接修改const修饰的全局变量:失败

简介修改const修饰的全局变量:失败,原因是放在常量区,受到保护

直接修改const修饰的局部变量:失败

直接修改const修饰的局部变量:成功,该局部变量其实放到了栈区,是伪常量

5字符串常量

不同编译器的处理方式有所区别

ANSI并未指定它的修改方式

有些编译器可以修改字符串常量,但有些不可以,某些编译器将相同的字符串常量看做同一个字符串常量

6void的使用方式

无类型,不可以创建变量,无法分配内存

限定函数返回值

限定函数参数列表

void是万能指针,不需要强制转化就可以给其他指针赋值

7sizeof的使用

sizeof的本质其实是一个运算符,类似于+-/

当统计某类型占的空间时需要加()

当统计mou变量占的空间时无需加()

返回值的类型是无符号整形,即unsigned int

数组名称如果作为函数参数,会退化为指针,指向数组首元素

8typedef的使用

它可以给类型起别名

简化struct关键字

区分数据类型

提高代码的可移植性

这个问题可能要咨询厦大老师了。。。
栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个 *** 作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为d出栈(pop),d出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。
函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。

首先这个程序里没有变量是放在堆里面的.常量字符串的类型是const char ,放在全局静态区(初始化数据段,在程序中所有赋了初值的全局变量,存放在这里),char a = "fffff",想改变a中字符串是错误的.
char a[] = {"me","you"};
char b[] = {"you","me"};
printf("%p %p",a[0],b[1]);
结果相同,均指向的是一个地址.str这个指针数组,里面的元素自然是在栈里.栈中数组都是连续的,堆中动态的内存也同样是连续的.需要注意的是,str中的连续是指的是str元素本身地址的连续,而不是内容的连续.

在哪定义只能说明变量的作用域,而不能确定变量属性,确定变量属性的关键是怎么定义;
比如只是在函数中定义 int a;那这是个临时变量是在栈中的,使用完自动销毁;
比如定义是int a; a=new int[10]; 那这个是分配在堆中的,使用完需要手动释放,防止内存泄漏。
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

栈也是内存,是内存就有地址,栈用主要用于函数调用时保存CPU寄存器状态压入函数调用参数和局部变量第一个问题,函数调用与执行时会用到栈,结束时将栈的内存地址(指针)返回没什么问题,主要是指针指向的是一个过期的地址,这个地址的数据可能在别的函数被调用时被意外的被更改,所以不要用指向局部变量的指针,有程序崩溃的危险性第二个问题 不见得申请一个局部变量就会压入堆栈,有些计算直接就在CPU寄存器里就完成了,并且虽说栈是后进先出但不是说访问栈非要从最后一个开始向前一个一个的访问,只要知道相对位置一样可以先读a 再读b 把程序写好,编译,对着汇编仔细对照吧

就如你问题中提到的,当函数int MAX(int x,int y)被赋予实参时,如下面代码所示

int main()
{
  int a=3,b=4;
  MAX(3,4);
  return 0;
}

此时函数MAX接收到的是a和b的拷贝值,也就是说函数在堆里面开辟一个空间,这个空间保存着两个值,分别是3和4,函数接下来 *** 作的数值都是这个堆空间上的数值,跟main函数里面的a和b无关,当函数执行完毕时(也就是return执行完)会回收空间,这时堆空间里面的3和4就会被处理掉


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10254699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存