Выделение динамической памяти внутри функции - C (СИ)

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

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

приветствую. Изучаю С, для лушчего усвоения изобретаю велосипед - попылатся реализовать собственный вариант strcpy с использованием динамической памяти. Вот что вышло:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void mystrcp(char *, char *, int );
  5. //int mystrlen(char *, int );
  6. int main()
  7. {
  8. char *str= "Hello World", *str2 ;
  9. int len;
  10. len = strlen(str);
  11. mystrcp(&(*str),&(*str2), len);
  12. free(str2);
  13. return 0;
  14. }
  15. void mystrcp(char *str, char *str2, int len )
  16. {
  17. if(NULL == (str2=malloc(len+1)))
  18. {
  19. printf("ERROR\n");
  20. exit(1);
  21. }
  22. for(int i=0;i<=len;i++)
  23. *(str2+i) = *(str+i);
  24. }
не работает. почему совершенно не могу разобраться. В данном случаем программа компилируется нормально, но при запуске вывод:
Листинг программы
  1. bash-4.2$ ./srt
  2. UWVSi
  3. *** glibc detected *** ./srt: double free or corruption (out): 0x08048530 ***
  4. ======= Backtrace: =========
  5. /lib/libc.so.6[0x4e4842b5]
  6. ./srt[0x80484b0]
  7. /lib/libc.so.6(__libc_start_main+0xf3)[0x4e42c413]
  8. ./srt[0x80483b1]
  9. ======= Memory map: ========
  10. 00c56000-00c57000 r-xp 00000000 00:00 0 [vdso]
  11. 08048000-08049000 r-xp 00000000 08:12 9306235 /home/obtical/sources/c/srt
  12. 08049000-0804a000 rw-p 00000000 08:12 9306235 /home/obtical/sources/c/srt
  13. 09fa5000-09fc6000 rw-p 00000000 00:00 0 [heap]
  14. 4e3f2000-4e40f000 r-xp 00000000 08:01 1972 /lib/ld-2.14.so
  15. 4e40f000-4e410000 r--p 0001d000 08:01 1972 /lib/ld-2.14.so
  16. 4e410000-4e411000 rw-p 0001e000 08:01 1972 /lib/ld-2.14.so
  17. 4e413000-4e598000 r-xp 00000000 08:01 2921 /lib/libc-2.14.so
  18. 4e598000-4e59a000 r--p 00184000 08:01 2921 /lib/libc-2.14.so
  19. 4e59a000-4e59b000 rw-p 00186000 08:01 2921 /lib/libc-2.14.so
  20. 4e59b000-4e59e000 rw-p 00000000 00:00 0
  21. 4e5fa000-4e616000 r-xp 00000000 08:01 7392 /lib/libgcc_s-4.6.0-20110530.so.1
  22. 4e616000-4e617000 rw-p 0001b000 08:01 7392 /lib/libgcc_s-4.6.0-20110530.so.1
  23. b7835000-b7836000 rw-p 00000000 00:00 0
  24. b7847000-b784a000 rw-p 00000000 00:00 0
  25. bffa6000-bffc7000 rw-p 00000000 00:00 0 [stack]
  26. Аварийный останов (core dumped)
если убрать free(str2), то ошибки никакой не происходит, но вместо строки выводится мусор.
Листинг программы
  1. bash-4.2$ ./srt
  2. UWVSi
если же попытаться вывывести содержимое str2 внутри функции mystrcp(), то никаких проблем нет и печатается строка. прошу помочь разобраться в чем проблема, ведь при завершении работы ф-ции память освобождаться не должна, а адрес тот же... заранее спасибо.

Решение задачи: «Выделение динамической памяти внутри функции»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void mystrcp(char *, char *, int );
  6. //int mystrlen(char *, int );
  7. int main()
  8. {
  9.         char *str= "Hello World", *str2 ;
  10.         int len;
  11.         len = strlen(str);
  12.         str2=(char*)malloc(sizeof(char) * len + 1);
  13.         mystrcp(str,str2, len);
  14.         puts(str2);
  15.         free(str2);
  16.         return 0;
  17. }
  18.  
  19. void mystrcp(char *str, char *str2, int len )
  20. {
  21.   int i;
  22.   for(i=0;i< len;i++)
  23.     str2[i] = str[i];
  24.   str2[i] = '\0';
  25. }

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

  1. #include — подключает файл стандартного ввода/вывода, что позволяет использовать функции для работы с консолью, такие как printf и puts
  2. #include — подключает файл stdlib.h, который содержит функции для работы с памятью, такие как malloc и free
  3. #include — подключает файл string.h, который содержит функции для работы со строками, такие как strlen и strcpy
  4. void mystrcp(char , char , int ); — объявление функции mystrcp, которая принимает три аргумента типа char* и int, и возвращает void (ничего не возвращает)
  5. int main() — объявление функции main, которая является точкой входа в программу и возвращает int (код возврата)
  6. char str= Hello World, str2 ; — объявление двух указателей на char, str и str2, и инициализация их значений строкой Hello World
  7. len = strlen(str); — вычисление длины строки с помощью функции strlen и сохранение результата в переменной len
  8. str2=(char)malloc(sizeof(char) len + 1); — выделение динамической памяти с помощью функции malloc для хранения строки str2, размер памяти равен len + 1 (так как нужна память для символа '\0' в конце строки)
  9. mystrcp(str,str2, len); — вызов функции mystrcp, передача ей аргументов str, str2 и len
  10. puts(str2); — вывод строки str2 на консоль с помощью функции puts
  11. free(str2); — освобождение выделенной памяти с помощью функции free
  12. return 0; — возврат значения 0 из функции main, что означает успешный конец работы программы
  13. void mystrcp(char str, char str2, int len ) — определение функции mystrcp
  14. int i; — объявление переменной i типа int, которая будет использоваться в цикле for
  15. for(i=0;i< len;i++) — начало цикла for, который будет выполняться, пока значение i меньше len
  16. str2[i] = str[i]; — копирование символа из строки str в строку str2 с помощью оператора присваивания
  17. str2[i] = '\0'; — добавление символа '\0' в конец строки str2, чтобы обозначить конец строки
  18. return; — возврат из функции mystrcp без возвращения значения
  19. *char str= Hello World;* — определение переменной str типа char и инициализация ее значением Hello World
  20. *char str2;* — определение переменной str2 типа char и инициализация ее значением пустой строкой (предполагается, что в памяти уже выделена достаточная область для хранения строки)

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


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

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

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы