Тема говорит все, вот соответствующий код, написанный в простом файле.освобождение указателя char в c вызывает segfault
char* fn = NULL;
SDL_Log("fn pre address is: %p\n",fn);
fn = get_resource("test.txt");
SDL_Log("fn pos address is: %p\n",fn);
//free(fn); <--this causes seg fault if I uncomment it
INFO: fn pre address is: 0x0
INFO: fn pre address is: 0x7fa882501a00
INFO: fn pos address is: 0x7fa882501a00
get_resource(const char* filename) {
char* string = (char*)calloc(1, sizeof(strlen(res_dir) + strlen(filename)));
//i also tried with strncpy
//strncpy(string, res_dir, strlen(res_dir));
//strncpy(string + strlen(res_dir), filename, strlen(filename));
memcpy(string, "/usr/test/files", strlen(res_dir));
memcpy(string + strlen("/usr/test/files"), filename, strlen(filename));
string[strlen(filename) + strlen("/usr/test/files")] = '\0';
return string;
}
получение такого же поведения. Если я освобожу выделенную строку, я получу ошибку seg. Кроме того, это не всегда случается так странно.
OT: 'string' - это плохое имя, также оно вводит в заблуждение, так как это * указатель * на первый элемент (символ здесь) памяти, выделенной вызовом' calloc() '. – alk
@alk также OT, но я считаю, что 'string' является очень подходящим именем для символа' char * '. –
@MrLister на некотором уровне абстракции, 'string' достаточно хорошо описывает, что означает' char * ', если он указывает на« C-строку ». Но я с @alk здесь по двум причинам: 1.) «Строка C» - это последовательность байтов, а не указатель на нее - последовательность будет часто оценивать указатель (если это массив или если вы просто используйте строковый литерал *) и 2.) именование переменной вроде этого просто не выразительно. Это похоже на запись 'int myInt = 42;' - отлично, что вы делаете из * этого * при чтении кода? –