Перестановка двух элементов любого размера в памяти - 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].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д