У меня есть этот код, чтобы воспроизвести проблему, которую я имею в другом месте. Проблема в том, что я думаю, что создаю независимую копию набора символов и предоставляю им независимый указатель, но по какой-то причине я не понимаю, что компилятор уверен, что указатель указывает на источник копии.Почему освобождение скопированной памяти влияет на копию?
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
typedef struct Str{
size_t len;
char* ptr;
}Str;
Str* newStr(char* str);
Str* cpyStr(Str* str);
int main(int argc, char *argv[]){
Str* a = newStr("This is a string");
printf("Returned string a is %s\n", a->ptr);
Str* b = cpyStr(a);
//free(a->ptr);
//free(a);
if(b == NULL) puts("Error getting b");
else printf("Returned string b is %s\n", a->ptr);
return 0;
}
Str* newStr(char* str){
size_t len = strlen(str) + 1;
if(len == 0) return NULL;
Str* toret = malloc(sizeof(Str));
if(toret == NULL) return NULL;
toret->len = len;
toret->ptr = malloc(len * sizeof(char));
if(toret->ptr == NULL) return NULL;
strncpy(toret->ptr, str, len);
return toret;
}
Str* cpyStr(Str* str){
Str* toret = malloc(sizeof(Str));
if(toret == NULL) return NULL;
toret->len = str->len;
printf("Len is %d\n", toret->len);
toret->ptr = malloc(toret->len * sizeof(char));
if(toret->ptr == NULL) return NULL;
strncpy(toret->ptr, str->ptr, toret->len);
return toret;
}
Если я не закомментировать свободный (a-> PTR) Я получаю строку, состоящую из квадратной коробки и некоторый случайный характер, в отличие от «Это строка».
Это C компиляция на mingw64.
'printf (" Возвращенная строка b является% s \ n ", a-> ptr);' должно быть 'printf (" Возвращенная строка b является% s \ n ", b-> ptr);' Ошибка не в вашем коде Str. Вы просто печатаете не то. –
Незначительный: предложите 'memcpy()', а не 'strncpy()', поскольку у вас есть полный размер. Также незначительно: чтобы уменьшить путаницу, подумайте о вызове поля 'len', когда это' size' строки, а не результат 'strlen()'. – chux