У меня есть программа синтаксического разбора файлов, которая вот так, моя программа вылетает при освобождении памяти. Я должен проверить, является ли значение пустым, тогда я должен освободить другую переменную malloced.Программа вылетает при освобождении памяти внутри структуры
struct db_handle_st {
char *server;
char *user;
};
int main()
{
char srv_conf_file[] = "C:\\\\Users\\admin\\Documents\\Visual Studio 2010\\Projects\\abcd\\abcd\\service.config";
FILE *fp = NULL;
db_handle_st db_details;
fp = fopen(srv_conf_file, "r");
if (fp != NULL) {
/* Look for key value pairs. */
while (fgets(line, sizeof(line), fp) != NULL) {
/* Get key */
key = line;
key[strlen(key) - 1] = '\0'; /* trim the newline. */
if ((value = strstr(line, "=")) != NULL) {
*value = '\0';
value++;
}
if (key && value)
printf(" %s: %s\n", key, value);
else
continue;
if (!strncmp(key, "SERVER", strlen("SERVER"))&&(strcmp(value,""))) {
/* if(strcmp(value,"")==0) {
goto err;
}*/
db_details.server = (char *)malloc(strlen(value)+1);
strcpy(db_details.server, value);
printf("db_details.server is %s\n",db_details.server);
}
if (!strncmp(key, "USER", strlen("USER"))&&(strcmp(value,""))) {
db_details.user = (char *)malloc(strlen(value)+1);
strcpy(db_details.user, value);
printf("db_details.user is %s\n",db_details.user);
}
}
}
if((db_details.user!=NULL) || (db_details.server!=NULL)) {
printf("something is zero\n");
if(db_details.user) {
free(db_details.user);}
if(db_details.server) {
free(db_details.server);}
}
}
Моя конфигурация выглядит следующим образом
SERVER=localhost
USER=
Когда я запустить эту программу, я получаю
"что-то равна нулю" и программа падает.
Что говорит отладчик? –
Вы не указали переменную 'line', которую вы используете в' while (fgets (строка, sizeof (строка), fp)! = NULL) {'. Это может быть источником неприятностей, или это может быть совершенно безобидным. (Вы также не показывали объявления 'key' и' value'.) Однако желательно, чтобы вы отправляли компилируемый код; вы должны показать нам MCVE ([Как создать минимальный, полный и проверенный пример?] (http://stackoverflow.com/help/mcve)). –