【问题标题】:Problem with global and local arrays in c++c++ 中的全局和局部数组的问题
【发布时间】:2020-08-11 03:07:28
【问题描述】:
#include<stdio.h>
int arr2[100]={0};


void performTask(int arr1[])
{
    for(i=1;i<50;i++)
    {
        arr1[i]=arr1[i]+arr1[i-1];
    }
    printf("\n%d %d",arr1[48],arr1[49]);
}

int main()
{

    for(int i=0;i<50;i++)
        arr2[i]=i;
    performTask(arr2);

    for(int i=0;i<50;i++)
        printf("\n%d ",arr2[i]);
}

当在 performTask() 函数中对 arr1 数组执行某些操作时,原始数组(即 arr2)也被操作。 如何更改此代码,以便在调用 performTask() 函数时 arr2 值保持不变?

【问题讨论】:

    标签: c arrays c++11


    【解决方案1】:

    数组函数参数本质上是指针(在元数据上添加了更多内容),因此当您将指向 arr2 的指针传递给您的函数,然后通过 arr1 参数访问它时,您访问的是相同的内存。

    如果要发送数组的副本,请照常分配内存(newmalloc 等),并将来自arr2memcpy 数据分配到新的内存缓冲区。

    【讨论】:

    • “添加了更多元数据”。不幸的是,事实并非如此。作为函数参数int arr1[] 只是int* arr1 仅此而已。
    【解决方案2】:

    在 C 中,数组表达式“衰减”为指向第一个元素的指针 - 当您调用时

    performTask(arr2);
    

    您将arr2 的第一个元素的地址 传递给函数,而不是其内容。 arr1 不是arr2副本,它 arr2

    适用于数组表达式。

    performTask 的主体内,您需要分配第二个相同类型和大小的数组:

    void performTask( int arr[], size_t size )
    {
      int *arr1 = malloc( sizeof *arr * size );
      memcpy( arr1, arr, size );
    
      // work with arr1 as normal
    
      free( arr1 );
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多