2014-10-06 3 views
0

Вот часть моего кодаПрисвоить массив в другой переменной

int river(int a[], int n){ 
    int sorted[] = a; 
} 

п быть размером массива

Я попробовал несколько различных способов, в том числе

sorted[n] 

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

Это просто невозможно из-за того, что что-то связано с динамическим изменением размера массива, или я просто пропущу точку?

Спасибо!

+0

Это то, что «memcpy» для. «Я хочу получать информацию, но не изменять исходный массив» - подождите ... тогда почему вы хотите ее скопировать? Просто используйте исходный массив. –

ответ

1

Вам нужно выделить пространство для новой копии массива самостоятельно.

int *sorted = malloc(n * sizeof(int)); 
memcpy(sorted, a, n * sizeof(int)); 
+0

Так что это проблема с распределением памяти, интересно. Большое спасибо! – mrybak834

+2

'int sorted [n]; memcpy (sorted, a, n * sizeof * a); '- тоже работает (если вы используете современный компилятор C, который поддерживает C99 или более позднюю версию). –

1

Просто попробуйте, как это ...

for(int i=0;i<n;i++) 
    sorted[i]=a[i]; 

Если вы хотите использовать динамическое выделение памяти malloc, попробуйте этот

 int *sorted = malloc(n * sizeof(int)); 
    memcpy(sorted, a, n * sizeof(int)); 
+0

Спасибо за ответ, но я пытался больше понять, почему моя реализация не работает. Спасибо за помощь, однако! – mrybak834

+1

Независимо от того, динамически ли распределен массив или нет, не имеет значения, использовать ли «memcpy» или цикл ... оба работают в любом случае. –

4

Прежде всего, массивы не могут быть переданы. Вы можете либо скопировать содержимое одного массива в другой, либо получить указатель на первый элемент массива. Например

int a[42] = {0}; 
int* b = a;  // now you can access a's elements as b[0], b[1], etc. 
int c[42]; 
memcpy(c, a, 42*sizeof(int)); //copy elements of a into c 

Во-вторых, следует отметить, что функция подписи

int foo(int a[]); 

это еще один способ сказать

int foo(int* a); 

т.е. он может принимать любую указатель на Int, даже те, что дон Не указывайте на массивы.

Имея это в виду, вы можете видеть, что вы легко потерять информацию о размере массива, поэтому вам нужно передать размер в качестве параметра:

int foo(int a[], size_t n); 

int a[42]; 
foo(a, 42); 

Теперь, внутри этой функции, вы можете скопировать элементы одного массива в другой:

int foo(int* a, size_t n) 
{ 
    int sorted[n]; 
    memcpy(sorted, a, n * sizeof(int)); 
    // use sorted 
    .... 
    return 0; 
} 
+0

Отличное объяснение, именно то, что я искал. Большое спасибо! – mrybak834

+0

1+, но nitpicking: 'int n' должен быть' size_t n' или даже лучше 'const size_t n' – alk

+0

@alk Согласен. Я просто основывал его на подписи OP. Но я это изменил. – juanchopanza

Смежные вопросы