C++问题,包括指针、数组和函数

标签 c++ arrays function pointers

所以我这里有两个程序,

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

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

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

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

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;
}

最佳答案

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

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

关于C++问题,包括指针、数组和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61672345/

相关文章:

javascript - 我如何将对象键名称指定为与其值相同的名称?

c++ - 带有 Boost 的 Cuda

c++ 数据对齐/成员顺序和继承

java - 增强的 For 循环 - 对象数组

reactjs - react 按键输入

function - 传递函数而不是调用它(Delphi)

c++ - 为什么要在 C++ 中将智能指针作为函数参数传递?

c++ - C++模板元编程的归纳法是什么?

c++ - 具有继承属性的 Boost Spirit 解析器 - 简单示例无法编译

python - 过滤 numpy 数组以仅保留给定值的一行