2015-06-07 2 views
1

Я пытаюсь написать функцию, которая меняет массив.Как изменить массив с помощью указателей?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void * reverse(void * array, int length, size_t size) { 
    void * temp = malloc(size); 
    int s = 0;   // start 
    int e = length - 1; // end 
    const int halp = length/2; 
    for (; s < halp; s++) { 
     memcpy(temp, (array + s), size); 
     memcpy((array + (s * size)), (array + (e * size)), size); 
     memcpy((array + (e * size)), temp, size); 
     e--; 
    } 
    free(temp); 
    return array; 
} 

int main(int argc, char * argv[]) { 
    int array[] = {0, 1, 2, 3, 4}; 
    for (int i = 0; i < 5; i++) { 
     printf("array[%d]: %d\n", i, array[i]); 
    } 
    printf("------------------------------------------\n"); 
    reverse(array, 5, sizeof(int)); 
    printf("------------------------------------------\n"); 
    for (int i = 0; i < 5; i++) { 
     printf("array[%d]: %d\n", i, array[i]); 
    } 
} 

Результат:

array[0]: 0 
array[1]: 1 
array[2]: 2 
array[3]: 3 
array[4]: 4 
------------------------------------------ 
------------------------------------------ 
array[0]: 4 
array[1]: 3 
array[2]: 2 
array[3]: 16777216 
array[4]: 0 

Почему результат имеет неожиданное значение?

+3

это не должно быть 'тетсру (темп, (массив + s * размер), размер);' в первом тетсру? Я имею в виду, что это похоже на все остальные строки. – Gosu

+0

@Gosu Пожалуйста, сделайте это как ответ, чтобы я мог его принять. –

+0

Просто добавив его в качестве ответа, мне пришлось сначала проверить его, чтобы быть уверенным :) – Gosu

ответ

2

Изменение от

memcpy(temp, (array + s), size); 

в

memcpy(temp, (array + s * size), size); // Note: s * size 


испытано, и она работает.

Выход:

array[0]: 0 
array[1]: 1 
array[2]: 2 
array[3]: 3 
array[4]: 4 
------------------------------------------ 
------------------------------------------ 
array[0]: 4 
array[1]: 3 
array[2]: 2 
array[3]: 1 
array[4]: 0 
Смежные вопросы