为啥数组打印在一个文件中,但发送到另一个文件时缺少数字
Posted
技术标签:
【中文标题】为啥数组打印在一个文件中,但发送到另一个文件时缺少数字【英文标题】:Why is the array printing in one file, but missing numbers when sent to another为什么数组打印在一个文件中,但发送到另一个文件时缺少数字 【发布时间】:2017-02-02 19:41:08 【问题描述】:main 看起来像这样,它编译得很好,但是当它调用显示 ptr 指向的数组时,出了点问题
#include "tools.h"
#include <iostream>
using namespace std;
int main()
short int Arr1[] = 5, 10 , 20 , 33, 444;
short int Arr2[] = 8, 1, 22, 333, 4, 555, 6, 7777;
short int* nptr ;
short int* ar1 = Arr1;
short int* ar2 = Arr2;
Display(ar1);
Display(ar2);
nptr = Concat(ar1,ar2);
Display(nptr);
这是我从中获取函数的文件,前两个数组的显示似乎工作正常,并且当仍在此文件中打印数组时
#include <iostream>
using namespace std;
void Display (short int* a)
short int ArraySize = *a;
short int num = *a;
for(short int i = 0; i < ArraySize; ++i)
num = *(a+i);
cout << num;
cout << " ";
cout << endl;
short int* Concat(short int* a1, short int* a2)
short int ArraySize = *a1 + *a2 + 1;
cout << ArraySize << endl;
short int Arr[ArraySize];
short int num1 = *a1;
short int num2 = *a2;
short int* ptr;
ptr = &Arr[0];
Arr[0] = ArraySize;
for(short int i = 0; i < *a1; i++)
num1 = *(a1+i);
Arr[i+1] = num1;
for (short int i = 0; i < *a2; i++)
num2 = *(a2+i);
Arr[i+*a1+1] = num2;
Display(ptr);
return ptr;
那么输出是这样的
5 10 20 33 444 // this line is fine
8 1 22 333 4 555 6 7777 // this line is fine
14 // fine
14 5 10 20 33 444 8 1 22 333 4 555 6 7777 // the way the array should be printed
14 5 10 20 3448 64 0 0 4736 96 0 0 2096 64 // the way it is printing and I need to fix
如果有人对这样做的原因有任何意见,或者我可以做些什么来解决它。我需要从主程序打印数组,而不是从文件中打印。
我还想提一下,我对这种语言的指针相当陌生。
【问题讨论】:
为什么不简单地使用std::vector
及其函数insert()
而不是Concat
之类的东西?此外,short int Arr[ArraySize];
不是有效的 C++,因为数组必须使用编译时常量而不是变量来声明。加上return ptr;
——你正在返回一个局部变量的地址——未定义的行为。这段 (C) 代码有太多错误。
Actual C++ example of what you're trying to accomplish
我不能使用向量,我要使用指针和 iostream,仅此而已
那你最好把不能用(不能用)的东西列出来。您已经在使用无效的 C++ 语法来声明数组。另外,学完这门课后,把它扔掉,学习真正的 C++,因为你写的是 C 代码。
你知道short int Arr[ArraySize]
的生命周期吗?你知道它什么时候开始存在,什么时候停止存在吗?
【参考方案1】:
好的,我想你有一些不清楚的地方。
首先,您在这里没有处理任何文件。这些是在堆栈上分配的数组。它们是特定大小,无法更改。
抱歉,如果我似乎在对您说话,那不是本意,但从您在这里所做的事情看来,您不了解堆栈的概念。
您的程序使用堆栈来跟踪它的位置,以及存储局部变量。当您调用一个函数时,它会将返回地址“推”到堆栈中,并在堆栈上为该函数中的局部变量分配空间。当你从一个函数返回时,它会“弹出”堆栈并返回到前一个地址。发生这种情况时,函数中的局部变量将不再有效。
在您的代码中,您在 Concat() 中声明了一个局部变量。当您从 Concat() 返回时,堆栈被弹出,并且您返回到该局部变量的指针不再有效。
要做你想做的事,你需要在 main() 中声明另一个数组,它大到足以容纳你需要的东西。您将把指向该新数组的指针作为第三个参数传递给 Concat()。
不要让消极情绪让你失望。没有人天生就是这方面的专家。
【讨论】:
Worth a discussion of the concept of Scope。答案围绕范围的边缘进行,但似乎将范围行为归因于堆栈。这有点误导,但由于堆栈实现本地范围的频率远远高于任何系统 OP 可能看到的答案。 我实际上已经解决了这个问题,当我使用数组来保存我的值时,这不是错误的方式,但不适合我希望我的程序运行的方式。我使用了 ptr 作为新 int 的想法,它解决了整个问题 @user4581301 是的,我试图解释程序打印输出的机制,而不是背后的理论。它在返回后打印垃圾,因为堆栈的那部分不再有效。返回指向您在堆栈上分配的对象的指针绝不是一个好主意。无论如何,使用现代 C++,大多数人不再处理原始指针。以上是关于为啥数组打印在一个文件中,但发送到另一个文件时缺少数字的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹时,被复制的任何“Apps 脚本”文件最终都会出现在 MyDrive 中,而不是指定的文件夹中 - 为啥?