【问题标题】:C++ question including pointer, array and functionC++问题包括指针、数组和函数
【发布时间】:2020-05-08 05:01:52
【问题描述】:

所以我这里有两个程序,

第一个是使用动态分配 第二个是使用固定大小的数组。

现在的问题是,通过使用动态分配,程序运行良好并且输出按预期正确打印。

但是,当使用固定大小的数组(第二个程序)时,程序运行没有错误,但输出不是我想要的。

除了数组的创建方式之外,程序几乎相同。但是两个数组仍然相同,所以输出不应该相同吗? 原因是什么??请帮我理解..

First Program Example:
input1      output1
    1            1
    2            2
    3            3
    4            4
    5            5

Second Program Example:
input1      output1
    1            1
    2            5
    3   2058618480
    4        32766
    5            5
// Using Dynamic Allocation
#include <iostream>

int *readNumbers(int n) { 
    int *a ;
    a = new int[n];

    for (int i=0; i<n; i++) {
        std::cout << "enter for a["<<i<<"]: ";
        std::cin >> a[i];
    }

    int *ptr;
    ptr= &a[0];

return ptr;
}


void printNumbers(int *numbers,int length){

    for (int i=0; i<length; i++) {    
    std::cout  << *(numbers+i) << "\n";
    }
} 


int main(){
    int n;
    std::cout << "enter for n: " ;
    std::cin >> n;  

    int *ptr; 
    ptr = readNumbers(n);
    printNumbers(ptr,n);

    delete [] ptr;    
    ptr = NULL;
return 0;
}

还有一个是

// Using fixed size array
#include <iostream>

int *readNumbers(int n) { 
    int a[5]={};    

    for (int i=0; i<5; i++) {
        std::cout << "enter for a["<<i<<"]: ";
        std::cin >> a[i];
    }

    int *ptr;
    ptr = &a[0];
return ptr;
}


void printNumbers(int *numbers,int length){

    for (int i=0; i<length; i++) {    
    std::cout << *(numbers+i) << "\n";
    }
} 


int main(){
    int *ptr; 
    ptr = readNumbers(5);
    printNumbers(ptr,5);
return 0;
}

【问题讨论】:

    标签: c++ arrays function pointers


    【解决方案1】:

    在您的第二段代码中,您的数组被分配在 readNumbers 函数内的堆栈上。然后将指向该堆栈内存的指针返回给调用函数。运行 printNumbers 时,此内存不再有效。它可能已被本地人在 printNumbers 中覆盖。

    在 main 中分配数组,然后第二个示例也应该可以工作。

    【讨论】:

    • 那么这是否意味着在第一段代码中,数组没有分配在函数内部的堆栈上?但如果是这样,那又如何呢??
    • 在第一个函数中,数组分配在堆上,只有指向内存的指针存储在堆栈上。然后该指针通过“ptr”传回主程序。在调用 delete 之前,堆上的内存是有效的。
    【解决方案2】:

    我觉得在第一种情况下,当您调用 new 运算符来分配内存以存储多个 int 值时,会分配堆内存。现在,当您将其传递给函数时,此内存可用,并且此内存在编程运行之前一直有效,直到有人调用 delete 运算符。所以你可以从 readNumbers、main 和 printNumber 传递这个指针,它是有效的。

    对于第二种情况,您在函数中创建了 int 数组作为局部变量,因此它是在堆栈中创建的。局部变量的范围仅在函数运行之前。在您的示例中, readNumbers 创建了数组,一旦函数结束,堆栈就会被清除。那就是函数中创建的所有局部变量都不再有效。 因此,当您在 main 和 printNumbers 等其他函数中使用此内存位置时,它将给出未定义的行为。有时结果是预期的,有时是无效的结果。所以你需要小心你从一个函数传递或返回到另一个函数。

    如果您仍想在第二种情况下获得预期结果,请将数组声明为静态。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多