Почему у меня ошибка сегментации

Я пытаюсь написать функцию, которая разбивает строку и возвращает массив каждого слова строки. Этот массив должен заканчиваться указателем NULL. Но когда я запускаю программу, у меня возникает ошибка сегментации.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

char **_strtok(char *str, const char *delim);

int main(void)
{
        char *str = "one,two,three/four-five six seven";
        char **ptr = _strtok(str, ",- /");
        int i;

        for (i = 0; ptr[i]; i++)
        {
                printf("%s\n", ptr[i]);
        }
        free(ptr);
        return (0);
}

/**
 * _strtok - function that splits a string and returns
 * an array of each word of the string
 * @str: the string to be parsed
 * @delim: the delimeter
 * Return : an array of each word of the string
 */

char **_strtok(char *str, const char *delim)
{
        char **ptr, *temp;
        int i, j, m, n, k = 0, l = 0;

        temp = malloc(strlen(str) + 1);
        if (temp == NULL)
        {
                printf("ERROR: Memory allocation failed\n");
                exit(1);
        }
        ptr = malloc(strlen(str) * 2);
        if (ptr == NULL)
        {
                printf("ERROR: Memory allocation failed\n");
                exit(1);
        }
        for (i = 0; str[i] != '\0'; i++)
        {
                for (j = 0; delim[j] != '\0'; j++)
                {
                        if (str[i] == delim[j])
                        {
                                temp[l] = '\0';
                                for (m = 0; temp[m] != '\0'; m++)
                                {
                                        ptr[k][m] = temp[m];
                                }
                                ptr[k++][m] = '\0';
                                free(temp);
                                temp = malloc((strlen(str) + 2 - l));
                                if (temp == NULL)
                                {
                                        printf("ERROR: Memory allocation failed\n");
                                        exit(1);
                                }
                                l = 0;
                                break;
                        }
                }
                if (delim[j] == '\0')
                {
                        temp[l++] = str[i];
                }

        }
        temp[l] = '\0';
        for (n = 0; temp[n] != '\0'; n++)
        {
                ptr[k][n] = temp[n];
        }
        ptr[k++][n] = '\0';
        ptr[k] = NULL;
        free(temp);
        return (ptr);
}
        

Ожидаемый результат — это массив строк, который должен быть напечатан в стандартном выводе. Но я получаю сегментацию по умолчанию.

Пробовали ли вы запускать свой код построчно в отладчике, отслеживая поток управления и значения всех переменных, чтобы определить, в какой строке ваша программа перестает вести себя так, как предполагалось? Если вы не пробовали это, то можете прочитать это: Что такое отладчик и как он может помочь мне в диагностике проблем? Вы также можете прочитать это: Как отлаживать небольшие программы?

Andreas Wenzel 21.02.2023 00:19

Вероятно, это как-то связано с тем, что ptr является массивом указателей, но malloc, который его создает, не имеет множителя sizeof(char*).

Dialecticus 21.02.2023 00:22
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы выделяете 1D-массив для ptr,

ptr = malloc(strlen(str) * 2);

Но это доступ в 2D

ptr[k][m] = temp[m];

Что определенно вызывает проблему.

Вы действительно уверены, что это проблема?

klutt 21.02.2023 01:05

Да, безусловно. Поскольку он никогда не знает 1-е измерение размера массива ptr. Если вы правильно распределите ptr, у него никогда не будет ошибки сегментации.

Duncan Chen 21.02.2023 01:50

Другие вопросы по теме