簡體   English   中英

釋放結構內的內存時程序崩潰

[英]Program crashes when freeing memory inside the structure

我有這樣的文件解析程序,我的程序在釋放內存時崩潰。 我必須檢查該值是否為空,然后我必須釋放另一個 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=

當我運行這個程序時,我得到

“某事為零”並且程序崩潰。

您需要將struct db_handle_st的字符指針初始化為 NULL,否則您可能會釋放一些隨機數據(否則它們的值未定義),這將導致崩潰。

PS:你並不需要檢查NULL之前調用freefreeNULL只是什么都不做),你也應該fclose你打開的文件。

你從未初始化db_handle_st db_details; 所以指針是不確定的,崩潰表明不確定的值不是空指針。

用:

db_handle_st db_details = { 0, 0 };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM