Перестановка двух элементов любого размера в памяти - C (СИ)
Формулировка задачи:
Добрый день,
Мне нужно переставить местами два элемента в памяти определенного размера.
Конкретно в необходимом случае - переставить местами в памяти две строки в массиве строк.
Я написал функцию для этой задачи, программа с этой ф-цией работает, но она выходит за пределы элементоы массива, как я понимаю.
Функция получает указатель на две строки из массива и интервал, с которым в памяти строки в массиве располагаются.
Ошибки вылазят в анализаторах вроде valgrind. Да и при освобождении памяти в конце-концов программа завершается с ошибкой.
Как исправить swap?
void swap(char *a, char *b, int width)
{
int i = 0;
char *buf;
buf = (char *)malloc(sizeof(char) * width);
printf("We are swapping %s and %s\n", a, b);
printf("Addresses are %d and %d\n", a, b);
printf("Buffer size is %d and width is %d; line sizes are %d and %d\n\n", _msize(buf), width, sizeof(a), sizeof(b));
memcpy(buf, a, width);
memcpy(a, b, width);
memcpy(b, buf, width);
free(buf);
}Before: 1). aaaaaasdfsdf: 2084016 2). fffffffffffa: 2084064 3). ddddadadadaa: 2084112 4). dfddddaaffff: 2084160 5). sssssssssssa: 2084208 We are swapping dfddddaaffff and fffffffffffa Addresses are 2084160 and 2084064 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping aaaaaasdfsdf and sssssssssssa Addresses are 2084016 and 2084208 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping ddddadadadaa and sssssssssssa Addresses are 2084112 and 2084016 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping ddddadadadaa and fffffffffffa Addresses are 2084016 and 2084160 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping dfddddaaffff and fffffffffffa Addresses are 2084064 and 2084016 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping dfddddaaffff and sssssssssssa Addresses are 2084016 and 2084112 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping fffffffffffa and sssssssssssa Addresses are 2084064 and 2084016 Buffer size is 48 and width is 48; line sizes are 4 and 4 We are swapping fffffffffffa and sssssssssssa Addresses are 2084016 and 2084064 Buffer size is 48 and width is 48; line sizes are 4 and 4 After: 1). sssssssssssa: 2084016 2). fffffffffffa: 2084064 3). dfddddaaffff: 2084112 4). ddddadadadaa: 2084160 5). aaaaaasdfsdf: 2084208
Хотя, если вместо width в memcpy брать strlen(a) (обе строки одинаковой длины), то всё нормально.
НО! Почему нельзя скопировать всю область между строками?
ADD: не, не нормально, строки всё-таки могут быть разной длины
Вопрос снят, дело оказалось в реализации malloc
Решение задачи: «Перестановка двух элементов любого размера в памяти»
textual
Листинг программы
for(int i=0;i<width;i++)
{
a[i]^=b[i];
b[i]^=a[i];
a[i]^=b[i];
}
Объяснение кода листинга программы
- В цикле происходит перестановка двух элементов любого размера в памяти.
- Цикл идет по всем элементам массива от начала до конца.
- При каждой итерации выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
- Результат операции записывается обратно в a[i].
- Затем выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
- Результат операции записывается обратно в b[i].
- В конце каждой итерации выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
- Результат операции записывается обратно в a[i].