Прежде всего, у вас есть неверное имя переменной kstring
.Используйте что-то еще, например kstring_init
, и присвойте ему значение.Я предполагаю, что вы хотите инициализировать переменную name
типа kstring
чем-то, а затем изменить ее длину.Так вот в чем дело.Затем определите константу типа char *
и инициализируйте с ней длину и данные вашей kstring.Затем используйте realloc
, чтобы расширить память указателя входным значением a, а не размером k
.Это не имеет смысла.Поскольку размер k
является размером указателя, который является постоянным.
В вашей функции: не используйте int
, если вы передаете size_t
.Используйте тот же тип данных, где вы делаете то же самое.
В цикле от 0
до lnth
вы выводите одну и ту же строку lnth+1
раз, что не имеет смысла.Вы, вероятно, хотите вывести символы строки.Так что используйте %c
и используйте индекс в массив символов и не устанавливайте <= lnth
, но < lnth
в качестве верхнего предела.Будьте осторожны с типами данных, если они подписаны и не подписаны!
Подсказка по дизайну: если у вас есть блок if, который оборачивает весь ваш код ... инвертируйте условие и просто выйдите, чтобы код был после блока if.
Будьте осторожны при работе с size_t
и int
, поскольку int
подписано, а size_t
нет, что может вызвать проблемы в операторах if.
Неиспользуйте abort
а скорее exit
.Вы не хотите, чтобы ваша программа аварийно прерывалась и дамп памяти.
Рабочая версия вашей программы:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
char *data;
size_t length;
} kstring;
kstring name;
char *kstring_init = "blabla";
void kstrextend(kstring *strp, size_t nbytes)
{
char *nwData;
size_t lnth = strp->length;
if ((int) lnth >= (int) nbytes) {
printf("Error, size already larger than requested size.\n");
exit(-1);
}
// new array allocate with large size and copy data to new array
nwData = realloc(strp->data, sizeof(char) * (int) nbytes);
if(nwData == NULL)
{
printf("Error, realloc returned NULL\n");
exit(-1);
}
//Making strp->data point to the new array
strp->data = nwData;
//Setting strp->length to the new size.
strp->length = nbytes;
for(int i = 0; i < lnth; i++)
{
printf("\n %c", strp->data[i]);
}
// filled with '\0' in remaining space of new array
for (int lp = lnth; lp < (int) nbytes; lp++)
{
strp->data[lp] = '\0';
printf("\n %c", strp->data[lp]);
}
}
int main(void)
{
size_t a;
printf("\n Enter number: ");
scanf("%d", &a);
name.length = strlen(kstring_init) + 1;
printf("Length of string is: %d\n", name.length);
name.data = (char*)malloc(sizeof(char) * name.length);
strcpy(name.data, kstring_init);
printf("Old string: %s\n", name.data);
printf("You want to reallocate %d bytes\n", a);
kstrextend(&name, a);
return 0;
}