2015-01-19 7 views
1

Я смотрел видео-лекцию о том, как сделать общий обмен с использованием memcpy() и strdup().Общая подкачка «строки» в C

Общий код своп выглядит следующим образом:

void GenericSwap(void* ptr1, void* ptr2, int size){ 

    char buf[size]; 
    memcpy(buf,ptr1,size); 
    memcpy(ptr1,ptr2,size); 
    memcpy(ptr2,buf,size); 
} 

и мы называем это так:

char* h = strdup("fred"); 
char* w = strdup("wilma"); 
GenericSwap(&h,&w,sizeof(char*)); 
printf("h : %s\nw : %s\n\n",h,w); 

Это поменялось «Фред» и «Вильма» в качестве целой строки. То есть, h указывает на «wilma» и w указывает на «fred» сейчас.

Однако, когда я изменить код для этого:

char h1[10] = "fred"; 
char w1[10] = "wilma"; 
GenericSwap(&h1,&w1,sizeof(char*)); 
printf("h1 : %s\nw1 : %s\n",h1,w1); 

я получаю "Вильму" и "Фрид" для h1 и w1. Я передаю адрес материала, содержащего адрес 1-го элемента массива, точно так же, как и правильный рабочий код вверху, но это не работает так хорошо, как верхний.

Это что-то около h1 и w1 является простым указателем, а не указателем на указатели?

ответ

3

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

Вместо этого вы меняете первый sizeof (char *) (который, кажется, 4 в вашей системе).

В основном для

char h[8] = "foo"; 

двух утверждений

printf("%p\n", (void *) h); 

и

printf("%p\n", (void *) &h); 

будет печатать тот же адрес, то есть выражение &h оценивает в адрес первой элемент, просто lik e h. Нет отдельной переменной, которая содержит адрес массива, чтобы вы могли измениться.

+0

ok! Тогда, скажем, в гипотетическом компиляторе, который ** позволяет ** разрешить это изменение адреса массива, в этом случае метод «& h» даст правильный ответ? как метод 'strdup()' дает? – Somjit

+0

@Somjit Такой компилятор не будет компилировать язык программирования C, поэтому, конечно, я не знаю. – unwind

+0

@unwind где OP пытается изменить адрес какого массива? –