Разобраться с динамическим выделением памяти в массиве строк - C (СИ)

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

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

Здравствуйте. Помогите разобраться с динамическим выделением памяти в массиве строк. Нашел в сети код очереди. Правда, там был тип хранящихся значений int. Я же переделал так, чтобы хранились не целые числа, а строки. Вот код:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct queue {
  5. char** v;
  6. int head;
  7. int tail;
  8. int size;
  9. int maxsize;
  10. };
  11. /* queue create: Creates an empty queue. */
  12. struct queue *queue_create(int maxsize) {
  13. struct queue *q = malloc(sizeof (*q));
  14. if (q != NULL) {
  15. q->v = (char**) malloc(sizeof(char*) * (maxsize+1));
  16. if (q->v == NULL) {
  17. free(q);
  18. return NULL;
  19. }
  20. q->maxsize = maxsize;
  21. q->size = 0;
  22. q->head = maxsize + 1;
  23. q->tail = 0;
  24. }
  25. return q;
  26. }
  27. /* queue_free: Removes queue. */
  28. void queue_free(struct queue *q) {
  29. free(q->v);
  30. free(q);
  31. }
  32. /* queue_size: Returns size of a queue. */
  33. int queue_size(struct queue *q) {
  34. return q->size;
  35. }
  36. /* queue_enqueue: Add item to the queue. */
  37. int queue_enqueue(struct queue *q, char* value) {
  38. if (q->head == q->tail + 1) {
  39. fprintf(stderr, "queue: queue overflow\n");
  40. return -1;
  41. }
  42. q->v[q->tail++] = (char*) malloc(strlen(value)+1);
  43. strcpy(q->v[q->tail++],value);
  44. q->tail = q->tail % (q->maxsize + 1);
  45. q->size++;
  46. return 0;
  47. }
  48. /* queue_dequeue: Gets item from the queue. */
  49. char* queue_dequeue(struct queue *q) {
  50. char *val;
  51. if (q->head % (q->maxsize + 1) == q->tail) {
  52. /* queue is empty */
  53. fprintf(stderr, "queue: Queue is empty\n");
  54. return NULL;
  55. }
  56. q->head = q->head % (q->maxsize + 1);
  57. q->size--;
  58. strcpy(val,q->v[q->head++]);
  59. free(q->v[q->head++]);
  60. return val;
  61. }
  62. int main() {
  63. struct queue *q;
  64. int i;
  65. char* val;
  66. q = queue_create(10);
  67. val = "stroka\n";
  68. for (i=0; i<10; i++) {
  69. queue_enqueue(q, val);
  70. }
  71. fprintf(stdout, "Очередь: \n");
  72. for (i=0; i<10; i++) {
  73. val = queue_dequeue(q);
  74. fprintf(stdout, "%s\n", val);
  75. }
  76. queue_free(q);
  77. return 0;
  78. }
В итоге, программа валится в функции queue_enqueue на строке strcpy(q->v[q->tail++],value); Ошибка сегментирования. Явно я что-то намудрил с выделением памяти, но на вид вроде все правильно. Может, у вас глаз наметан лучше...

Решение задачи: «Разобраться с динамическим выделением памяти в массиве строк»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <glib.h>
  3.  
  4. int main(void) {
  5.     char buf[BUFSIZ], * ptr;
  6.     GQueue * queue = g_queue_new();
  7.    
  8.     while ( printf("> ") > 0 && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
  9.         g_queue_push_tail(queue, g_strdup(buf));
  10.    
  11.     while ( ptr = g_queue_pop_head(queue) ) {
  12.         printf("%s", ptr);
  13.         g_free(ptr);
  14.     }
  15.    
  16.     g_queue_free(queue);
  17.     return 0;
  18. }

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

  1. Включаются необходимые заголовочные файлы
  2. Объявляются переменные: buf - массив символов, ptr - указатель на строку, queue - очередь
  3. Создается новая очередь
  4. В цикле запрашивается ввод строки и добавляется в конец очереди
  5. В цикле пока очередь не пуста, извлекается первая строка, выводится на экран и освобождается память
  6. Освобождается память, выделенная под очередь
  7. Завершается программа

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


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

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

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

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

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

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