Вот код, с которым у меня возникла проблема:
Структура:
struct AtoB
{
char * strA;
char * strB;
};
Функция для создания структуры. Вызывается из внешнего файла.
AtoB * atob_create(char * a)
{
struct AtoB * atob = (struct AtoB *)malloc(sizeof(struct AtoB));
atob->strA = malloc(sizeof((char *)a));
strcpy(atob->strA, a);
atob->strB = NULL;
/* HERE IS PROBLEM NO 1 - SEGMENTATION ERROR OCCURS */
atob->strB = (char*)malloc(1);
strB = "\0";
for(int i = 0; i < (int)strlen(atob->strA); i++)
{
char token = atob->strA[i];
/*
:
append(AtoB * atob, const char a) MAY be called, so atob->strB &
atob->StrA will not be the same length
*/
append(atob, (char)token);
}
}
Функция для добавления char
к char *
в пределах struct
. Вызывается рекурсивно.
void append(AtoB * atob, const char a)
{
size_t sz = strlen(atob->strB);
/* HERE IS ANOTHER ISSUE:
1: is this the right way to increase the size of the char * ?
2: does the struct also need to be realloc here to accommodate?
*/
atob->strB = (char*)realloc(atob->strB, sz + 1);
atob->strB[sz - 1 = a];
atob->[sz] = "\0";
}
Функция для получения окончательной строки. Вызывается из внешнего файла.
char * (AtoB * atob)
{
return (atob->strB);
}
Функция освобождения всей выделенной памяти. Вызывается из внешнего файла.
void free(AtoB * atob)
{
free(atob->strA);
free(atob->strB);
free(atob);
}
В качестве упражнения мне нужно использовать C и взять содержимое одной строки, скопировав его в другом порядке или опустив или добавив определенные символы на основе критериев, которые здесь не являются проблемой (поэтому не включены в код).
У меня нет проблем с созданием структуры или размещением первого char * strA
. Проблема возникает, когда я пытаюсь выделить память (даже один символ) для char * strB
.
Я получаю ошибку сегментации.
Кажется, не имеет значения, как я пытаюсь это сделать, я читал различные примеры и пробовал разные способы, и я просто не могу заставить его работать. Я знаю, что здесь есть проблема с памятью, но я не могу ее решить.
Даже если я попытаюсь realloc
создать структуру, я не смогу инициализировать strB
чем-то большим, чем NULL
. Мне нужно иметь возможность добавлять к atob->strB
во время выполнения, окончательная длина строки отличается от длины atob->strA
.
Следуя примерам в Интернете, я подумал, что это (как самая простая инициализация) будет работать... но это не так:
atob->strB = NULL;
atob->strB = (char*)malloc(1);
atob->strB[0] "\0";
Это как-то связано со структурой, в которой он находится?
Я действительно не могу понять, что не так, потратил много времени на поиск похожих проблем на разных форумах, читая тему и пробуя каждое решение, которое я могу, просто пытаясь пройти мимо этой первой проблемы.
Теперь я просто сбит с толку и у меня нет времени, чтобы решить эту проблему. Если кто-то может сказать мне фактический код, который мне нужен, тогда я смогу прочитать его и понять, что вы сделали и почему это правильный метод. Я прокомментировал области, где мне не ясно, и был бы очень признателен за правильное решение.