Не забудь учесть, что размер должен быть типа size_t, а не int. И не забудь про проверку результата malloc(). Желательно, чтобы функция возвращала значение, чтобы можно было вернуть код успеха/ошибки. Ну поставь assert’ы, что входные указатели не нулевые и не равны друг другу.
void swap (void* a, void* b, size_t n) {
size_t buf_size = 64; // можно больше, можно меньше
char buf[64];
size_t m = n % buf_size;
n /= buf_size;
for (size_t i = 0; i < n; i++) {
memcpy (buf, a, buf_size);
memcpy (a, b, buf_size);
memcpy (b, buf, buf_size);
}
memcpy (buf, a, m);
memcpy (a, b, m);
memcpy (b, buf, m);
}
Очевидно - нужен третий параметр, либо указатель на функцию, либо указатель на тип, либо размер. Но размер - это провал, т.к. структура может содержать указатели.
Очевидно - нужен третий параметр, либо указатель на функцию, либо указатель на тип, либо размер. Но размер - это провал, т.к. структура может содержать указатели.
Подолью масла в огонь.
А если структура к примеру vector содержит?
А вот если там список, то с этим даже хваленые кресты не справятся! Все равно придется писать отдельную функцию для этого случая (но конкретно для свопа проще указатели местами поменять)!
Какие ты видишь проблемы при memcpy() такой структуры?
Ну ты и слабенький, никаких проблем там не будет, указатели можно смело обменивать. Или ты собрался обменивать местами данные на которые указывает name🤣🤣🤣. Я же говорю, реально слабенький.
Это называется «стандартная херня, которую любой школьник знает».
Ага, а когда школьник выпускается из школы и идёт работать, ему объясняют, что кроме побайтной обработки этот код ещё и генерирует лишние чтения-записи на ровном месте.
Мне казалось, что так проще и наглядней, ну мне как минимум, и к тому же пример. swap через xor - неописуемый баян, который знают все, какое тут нафиг какерство.