t1 = newText(text);
Здесь вы устанавливаете t1
на новый text
. Однако оригинал text
, на который указывал t1
, здесь не меняется. Это все еще указывает на то же место. Указатель, который вы передали в функцию, является копией исходного указателя, поэтому, даже если t1
указывает на новый text
, оригинал - нет.
Так что, когда вы делаете печать здесь
printf("%d\n", t->capacity);
Вы по-прежнему получаете старое значение мощности. А точнее, вместимость старого t1
. Тогда как здесь
printf("%s \n", t1->content);
printf("%d \n", t1->capacity);
Вы печатаете content
и capacity
нового t1
, на который вы теряете указатель после завершения функции.
Вы можете исправить это, например, вернув этот указатель. Измените подпись на
text* append(text *t1, text *t2)
И в конце функции:
return t1;
А потом вы обновляете t1
, поэтому измените это
append(t, t1);
К
t1 = append(t, t1);
Также следите за утечками памяти. Как и сейчас, в append
вы берете указатели на два действительных text
и выделяете новый text
, а в конце функции у вас остается только два указателя на text
а вы не free
ничего. Это показывает нам, что один из них просочился.
Edit:
Если вы не можете изменить сигнатуру функции, вы не можете вернуть новый text
или передать его с помощью двойного указателя. В этом случае я бы предложил не создавать новый text
, а просто изменить t1
. Используя realloc
, вы можете изменить размер буфера (на самом деле, он может просто выделить новый буфер, скопировать данные и освободить старый буфер), чтобы вы могли добавить содержимое t2
.
void append(text *t1, text *t2) {
int length1 = strlen(t1->content);
int length2 = strlen(t2->content);
int lengths = length1 + length2; // calculate the required length. You can change this to have some "reserve" such as in newText. In this example, it will be 24
t1->content = realloc(t1->content, lengths); // set the correct size for the buffer
for (int i = length1; i < length1 + length2; i++) {
t1->content[i] = t2->content[i - length1];
t1->content[i + 1] = '\0';
} // append the second string
t1->capacity = lengths;
printf("%s \n", t1->content);
printf("%d \n", t1->capacity);
}