【问题标题】:Dynamically allocated array动态分配的数组
【发布时间】:2020-09-13 06:49:40
【问题描述】:

我正在学习指针,但我被困在数组的动态分配上。

下面的代码提供了一个函数来查找具有最低值的元素。 动态分配的数组作为参数传递给它。

#include <cstdlib>
#include <iostream>

using namespace std;

int findMin(int *arr, int n);

int main()
{
    int *nums = new int[5];
    int nums_size = sizeof(*nums);

    cout << "Enter 5 numbers to find the minor:" << endl;
    for(int i = 0; i < nums_size; i++)
        cin >> nums[i];

    cout << "The minor number is " << findMin(*nums, nums_size);

    delete [] nums; 

    return 0;
}

但它返回此错误:

error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]

如何将该数组传递给函数?

只是为了好奇:如果我的数组由 5 个元素组成,为什么 for 循环允许我输入 4 个值?

【问题讨论】:

  • 请注意,在这种情况下不需要new。您应该使用 int[] nums[5]; 在堆栈上分配它 - 它更快,并且不会在您需要显式删除的堆上分配内存。
  • *nums 是一个int* 是类型的一部分,而不是变量标识符的一部分。
  • 想想你是否写过int* nums = createArray()。在编译时没有办法从一个指向整数的指针知道它指向多少个整数。也许你没有意识到sizeof is a compile-time thing,不是运行时的东西。

标签: c++ arrays function parameters heap-memory


【解决方案1】:

如何将该数组传递给函数?

nums 已经是一个类型int*,你不需要取消引用它:

findMin(nums, nums_size);

如果我的数组由 5 个元素组成,为什么 for 循环允许我输入 4 个值?

int nums_size = sizeof(*nums); 并没有按照你的想法去做。它相当于sizeof(nums[0]),相当于sizeof(int),恰好等于您机器上的4
无法提取堆上分配的数组大小,需要自己保存大小:

int nums_size = 5;
int* nums = new int[nums_size];

【讨论】:

    【解决方案2】:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int findMin(int *arr, int n){
        int mn=INT_MAX;
        for(int i=0;i<n;i++){
            if(arr[i]<mn){
                mn=arr[i];
            }
        }
        return mn;
    };
    
    int main()
    {
        int nums_size = 5; 
        int *nums = new int[nums_size];
    
        cout << "Enter 5 numbers to find the minor:" << endl;
        for(int i = 0; i < nums_size; i++)
            cin >> nums[i];
    
        cout << "The minor number is " << findMin(nums, nums_size);
    
        delete [] nums; 
    
        return 0;
    }
    

    上面的代码工作正常。您的错误在于将数组传递给函数。

    还要添加-

    您的代码只进行了 4 次迭代,因为 sizeof(*nums) 返回了指针指向的基本索引元素的大小,即 sizeof(num[0])。所以我做了一个小改动,现在它可以正常工作了。

    【讨论】:

    • sizeof(*nums) 没有按照您的描述进行操作。
    • 尝试将int *nums = new int[5]; 更改为int *nums = new int[10];sizeof(*nums) 仍然是相同的(尽管数组容量更大)。
    • 那我该怎么办?
    • @UnoaCaso 该程序现在运行良好。我进行了编辑。
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2014-08-19
    • 2015-03-09
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多