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

问题描述 投票:3回答:1

所以我这里有两个程序。

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

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

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

除了创建数组的方式外,程序几乎是一样的...但两个数组还是一样的,所以输出不应该是一样的吗?请帮我理解一下。

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个回答
1
投票

在你的第二段代码中,你的数组是在readNumbers函数的堆栈中分配的。然后你返回一个指向堆栈内存的指针给调用函数。当printNumbers运行时,这个内存不再有效。它可能已经被printNumbers中的locals覆盖了。

在main中分配数组,那么第二个例子应该也可以。


1
投票

我觉得在第一种情况下,当你调用new operator分配内存来存储多个int值时,堆内存被分配了。现在,当你把它传给函数时,这个内存是可用的,而且这个内存在编程运行前一直有效,直到有人调用delete operator。所以你可以从readNumbers,main和printNumber中传递这个指针,它是有效的。

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

如果你仍然想在第二种情况下得到预期的结果,声明arrray为静态。

希望这对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.