2015-10-12 2 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void swap (void *vp1, void *vp2, const size_t size) { 
    char *buffer = (char *)malloc(sizeof(char)*size); 
    memcpy(buffer, vp1, size); 
    memcpy(vp1, vp2, size); 
    memcpy(vp2, buffer, size); 
    free(buffer); 
} 

int main() 
{ 
    char *puppy = strdup("Wow"); 
    char *kitty = strdup("Mew"); 

    printf("%s, %s\n", puppy, kitty); 
    swap(&puppy, &kitty, sizeof(char **)); 
    printf("%s, %s\n", puppy, kitty); 

    free(puppy); 
    free(kitty); 

    return 0; 
} 

Я пытаюсь сделать практику, чтобы понять, используя void* и memcpy(). В этом коде сначала я подумал swap(puppy, kitty, sizeof(char *)); Он работает. Но я не понимаю использования swap(&puppy, &kitty, sizeof(char **)); Может ли кто-нибудь объяснить, как работает вторая своп?функция подкачки с помощью тетсру силы *

+0

Должен ли 'const int size' быть' const size_t size'? –

+0

Ни одна из двух не верна. – user3528438

+0

@ user3528438 - Что вы предлагаете? –

ответ

2

После следующих двух строк:

char *puppy = strdup("Wow"); 
char *kitty = strdup("Mew"); 

Использование памяти выглядит примерно так:

puppy 
+-----------+  +---+---+---+-----+ 
| address1 | -> | W | o | w | \0 | 
+-----------+  +---+---+---+-----+ 

kitty 
+-----------+  +---+---+---+-----+ 
| address2 | -> | M | e | w | \0 | 
+-----------+  +---+---+---+-----+ 

Вы можете осуществить подкачки несколько способов:

Своп Метод 1: изменить значения указателей.

puppy 
+-----------+  +---+---+---+-----+ 
| address2 | -> | M | e | w | \0 | 
+-----------+  +---+---+---+-----+ 

kitty 
+-----------+  +---+---+---+-----+ 
| address1 | -> | W | o | w | \0 | 
+-----------+  +---+---+---+-----+ 

Своп Метод 2: Измените содержимое того, что указатели указывают на:

puppy 
+-----------+  +---+---+---+-----+ 
| address1 | -> | M | e | w | \0 | 
+-----------+  +---+---+---+-----+ 

kitty 
+-----------+  +---+---+---+-----+ 
| address2 | -> | W | o | w | \0 | 
+-----------+  +---+---+---+-----+ 

Если вы хотите, поведение первого подхода, вы должны использовать:

swap(&puppy, &kitty, sizeof(char*)); 

Если вам требуется поведение второго подхода, вам необходимо использовать:

swap(puppy, kitty, strlen(puppy)); 

Имейте в виду, что второй подход будет проблемой, если строки имеют разную длину.

+0

' swap (& puppy, & kitty, sizeof (char *)); 'или' swap (& puppy, & kitty, sizeof (char **)); '? – snr

+0

'sizeof (char *)' прав, поскольку вы меняете один объект 'char *'. –

+0

@AugustKarlstrom, вот что я имел в виду. Я надеялся, что это ясно. –