为啥数组打印在一个文件中,但发送到另一个文件时缺少数字

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 中,而不是指定的文件夹中 - 为啥?

将 .txt 复制到 int 数组,然后保存到另一个文件中

为啥火花延迟加载比通配符或在数组中传递文件夹慢?

Golang:在文本文件中发送查询时“函数结束时缺少返回”

为啥我的 Access 报告在打印时被切断?