Перестановка двух элементов любого размера в памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, Мне нужно переставить местами два элемента в памяти определенного размера. Конкретно в необходимом случае - переставить местами в памяти две строки в массиве строк. Я написал функцию для этой задачи, программа с этой ф-цией работает, но она выходит за пределы элементоы массива, как я понимаю. Функция получает указатель на две строки из массива и интервал, с которым в памяти строки в массиве располагаются.
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
Ошибки вылазят в анализаторах вроде valgrind. Да и при освобождении памяти в конце-концов программа завершается с ошибкой. Как исправить swap?
Хотя, если вместо 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];
 
}

Объяснение кода листинга программы

  1. В цикле происходит перестановка двух элементов любого размера в памяти.
  2. Цикл идет по всем элементам массива от начала до конца.
  3. При каждой итерации выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
  4. Результат операции записывается обратно в a[i].
  5. Затем выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
  6. Результат операции записывается обратно в b[i].
  7. В конце каждой итерации выполняется операция побитового исключающего OR (^) между текущими значениями элементов a[i] и b[i].
  8. Результат операции записывается обратно в a[i].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы