Проблема с глобальными и локальными массивами в c ++ - PullRequest
0 голосов
/ 27 апреля 2020
#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]);
}

Когда некоторые операции выполняются с массивом arr1 в функции executeTask (), также выполняется манипуляция с исходным массивом (т. Е. Arr2). Как я могу изменить этот код, чтобы значения arr2 оставались неизменными при вызове функции executeTask ()?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

В C выражения массива «затухают» для указателя на первый элемент - когда вы вызываете

performTask(arr2);

, вы передаете адрес первого элемента arr2 к функции, а не к ее содержимому. arr1 не является копией из arr2, это является arr2.

Это только true для выражений массива.

В теле 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 );
} 
0 голосов
/ 27 апреля 2020

Аргументы функции массива по сути являются указателями (с некоторыми более привязанными к метаданным), поэтому, когда вы передаете указатель на arr2 своей функции, а затем получаете доступ к ней через параметр arr1, вы получаете доступ к той же памяти.

Если вы хотите отправить копию массива, выделите память как обычно (new, malloc, как угодно) и memcpy данные из arr2 в новый буфер памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...