2015-10-11 4 views
-3

У меня есть программа синтаксического разбора файлов, которая вот так, моя программа вылетает при освобождении памяти. Я должен проверить, является ли значение пустым, тогда я должен освободить другую переменную 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= 

Когда я запустить эту программу, я получаю

"что-то равна нулю" и программа падает.

+0

Что говорит отладчик? –

+0

Вы не указали переменную 'line', которую вы используете в' while (fgets (строка, sizeof (строка), fp)! = NULL) {'. Это может быть источником неприятностей, или это может быть совершенно безобидным. (Вы также не показывали объявления 'key' и' value'.) Однако желательно, чтобы вы отправляли компилируемый код; вы должны показать нам MCVE ([Как создать минимальный, полный и проверенный пример?] (http://stackoverflow.com/help/mcve)). –

ответ

1

Вам необходимо инициализировать указатели полукокса в struct db_handle_st в NULL в противном случае вы могли бы освободить некоторые случайные данные (их значение не определено иначе), и это приведет к аварии.

PS: Вам не нужно проверять NULL перед вызовом free (free на NULL просто ничего не делает) и вы должны fclose файл, который вы открыли.

0

Вы никогда не инициализировали db_handle_st db_details;, чтобы указатели были неопределенными, а сбой указывает, что неопределенное значение не является нулевым указателем.

Использование:

db_handle_st db_details = { 0, 0 }; 
Смежные вопросы