VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2013|回复: 5

[已解决]关于动态定义数组

[复制链接]
19_avatar_middle
最佳答案
0 
在线会员 发表于 2021-7-10 20:17:14 | 显示全部楼层 |阅读模式
是这样的,今天在运行一行代码时,我尝试着动态定义数组,从键盘键入数组大小
输入代码如下
       int n;
        cin>>n;
        int a[n];
        for(int i=0;i<n;i++)cin>>a[i];
这一段总会报错,我就想知道怎样定义动态数组,求各位解答。
最佳答案
00_avatar_small
2021-7-11 07:56:25
有没有想过
你遇到的问题其他新手也遇到过
问搜索引擎更好
以下是搬运代码
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.    int n;   //输入数组长度
  6.    cin>>n;
  7.    int *p;  //声明一个指针
  8.    p=new int[n]; /*创建了一个长度为n的动态数组,并且返回这个数组的首地址给p,p就指向了这个动态数组,可以通过指针p
  9.                  来操作数组,因为创建的动态数组并没有名字,只返回了首地址给p,所以可以把p看作是这个动态数组的名字 */
  10.    for(int i=0;i<n;i++)
  11.        cin>>p[i];
  12.    for(int i=0;i<n;i++)
  13.        cout<<p[i]<<" ";
  14.    delete []p;  //释放这个一维的动态数组,而不是释放指针p。用完以后要记得释放掉
  15.    cout<<p;    //输出指针p的地址
  16.    return 0;
  17. }
复制代码




上一篇:vs视图
下一篇:为什么在调用父类虚函数
07_avatar_middle
最佳答案
12 
在线会员 发表于 2021-7-12 09:41:45 | 显示全部楼层
这里,我们姑且认为数组就是一段连续的内存空间,只关心数组的起始地址和大小两个要素。
对于连续的内存空间来说,申请内存的方式至少有两种,
(1) 形如int a[10];这种方式,这种方式下,连续内存空间大小和起始地址是在程序编译的时候就已经确定的。编译器根据语法规则,分析出你想要申请的是10个int大小的一段内存,然后再在进程的内存空间中给你预留这么一块内存。
(2) 形如int* pa = new int[10];这种方式下,连续内存空间的大小和起始地址都是在程序运行时才确定的。编译时,编译器并没有给你预留这段内存。当程序运行到这个语句时,才会进行内存分配。
所以,你的写法:
  1. int n;
  2.         cin>>n;
  3.         int a[n];
复制代码

这种写法实际上是以上两种形式的杂合。申请内存的方式用的是int a[n]这种形式,这就要求在编译时明确的给出n的值。实际上,编译时,n的值是未知的。编译器无法确定要给数组a保留多大的内存空间。之前你自己使用宏定义的时候可以编译,是因为宏定义只是做内容替换,实际上你还是明确的给出了内存空间的大小。
所以,对于想要动态的确定数组大小的时候,需要使用int* pa = new int[n]这种形式。就像上面oyxbl给的代码那样。

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
00_avatar_small oyxbl + 1 + 1 赞一个!

查看全部评分

00_avatar_middle
最佳答案
13 
在线会员 发表于 2021-7-11 07:56:25 | 显示全部楼层    本楼为最佳答案   
bestAnswer
有没有想过
你遇到的问题其他新手也遇到过
问搜索引擎更好
以下是搬运代码
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.    int n;   //输入数组长度
  6.    cin>>n;
  7.    int *p;  //声明一个指针
  8.    p=new int[n]; /*创建了一个长度为n的动态数组,并且返回这个数组的首地址给p,p就指向了这个动态数组,可以通过指针p
  9.                  来操作数组,因为创建的动态数组并没有名字,只返回了首地址给p,所以可以把p看作是这个动态数组的名字 */
  10.    for(int i=0;i<n;i++)
  11.        cin>>p[i];
  12.    for(int i=0;i<n;i++)
  13.        cout<<p[i]<<" ";
  14.    delete []p;  //释放这个一维的动态数组,而不是释放指针p。用完以后要记得释放掉
  15.    cout<<p;    //输出指针p的地址
  16.    return 0;
  17. }
复制代码
19_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-11 22:43:02 | 显示全部楼层
oyxbl 发表于 2021-7-11 07:56
有没有想过
你遇到的问题其他新手也遇到过
问搜索引擎更好

你好,我百度了一下,没有找到,可能我的搜索引擎不大行。这种方法确实实现了数组的动态输入,但是,我要做的一个程序,需要数组作为实参去传递给子函数,然后进行按某种规则对数组进行排序,改成这种动态之后,没能运行出我要的结果。也不大明白问题在哪。我目前用define宏定义,每次想换手动改.....
00_avatar_middle
最佳答案
13 
在线会员 发表于 2021-7-12 07:42:04 | 显示全部楼层
本帖最后由 oyxbl 于 2021-7-12 07:50 编辑
初学c的小菜鸟 发表于 2021-7-11 22:43
你好,我百度了一下,没有找到,可能我的搜索引擎不大行。这种方法确实实现了数组的动态输入,但是,我要 ...


你知道容器吗
  1. #include <vector>
  2. UINT64 WriteByte(UINT64 addr, vector<BYTE> byteArrary)
  3. {
  4.         return WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr, byteArrary.data(), byteArrary.size(), NULL);
  5. }
  6. UINT64 WriteByte(0x400400, {90,90,90,90});
复制代码
19_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-12 23:20:46 | 显示全部楼层
freehawkzk 发表于 2021-7-12 09:41
这里,我们姑且认为数组就是一段连续的内存空间,只关心数组的起始地址和大小两个要素。
对于连续的内存空 ...

嗯,好,谢谢你的耐心解答
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-28 01:48

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表