簡體   English   中英

我認為我的指針有問題

[英]I have a trouble with pointers i think

所以我試圖用C語言為我的大學做一個練習! 我的代碼編譯得很好,但它在運行時因異常而崩潰:“EceProj.exe 中的 0x00007FFAF517D751 (ucrtbased.dll) 處拋出異常:0xC0000005:訪問沖突讀取位置 0xFFFFFFFFFFFFFFFF。” 誰能幫幫我嗎。 下面是我的代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct Log {
    char*   field1;
    char*   field2;
    int     field3;
    float   field4;
    float   field5;
    float   field6;
    float   field7;
    float   field8;
    float   field9;
}log_t, *plog;

FILE* OpenFile(const char* path) 
{
    FILE* file = NULL;
    file = fopen(path, "r");
    if (file == NULL)
        printf("File cant be opened\n");
    else
        printf("File is opened\n");
    return file;
}

log_t CreateLog(FILE* file)
{
    plog log = (plog)malloc(sizeof(plog));
    fscanf(file, "%s", log->field1);
    fscanf(file, "%s", log->field2);
    fscanf(file, "%d", &(log->field3));
    fscanf(file, "%f", &(log->field4));
    fscanf(file, "%f", &(log->field5));
    fscanf(file, "%f", &(log->field6));
    fscanf(file, "%f", &(log->field7));
    fscanf(file, "%f", &(log->field8));
    fscanf(file, "%f", &(log->field9));
    return *log;
}

void PrintLog(log_t log)
{
    printf("%s", log.field1);
}

int main()
{
    FILE* file;
    file = OpenFile("DataMeteoE4.txt");
    log_t log = CreateLog(file);
    PrintLog(log);
    fclose(file);
    return 0;
}

我打開的文件是這個文件,其中包含一些帶有溫度和壓力等的日志。這些是文件的內容。

2015-07-22 09:00:00 1346137 13.03 25.13 6.474 3.805 0.832 25.84
2015-07-22 09:01:00 1346138 13.03 25.15 6.5 3.84 0.834 25.89
2015-07-22 09:02:00 1346139 13.03 25.19 6.477 3.851 0.836 26.02
2015-07-22 09:03:00 1346140 13.03 25.22 6.493 3.879 0.841 26.07
2015-07-22 09:04:00 1346141 13.02 25.25 6.516 3.91 0.846 26.01

對於初學者這個功能

log_t CreateLog(FILE* file)
{
    plog log = (plog)malloc(sizeof(plog));
    fscanf(file, "%s", log->field1);
    fscanf(file, "%s", log->field2);
    fscanf(file, "%d", &(log->field3));
    fscanf(file, "%f", &(log->field4));
    fscanf(file, "%f", &(log->field5));
    fscanf(file, "%f", &(log->field6));
    fscanf(file, "%f", &(log->field7));
    fscanf(file, "%f", &(log->field8));
    fscanf(file, "%f", &(log->field9));
    return *log;
}

存在內存泄漏,因為退出函數后分配的內存地址丟失。

您正在從文件中讀取指針 field1。 它的值對於程序的當前狀態可能無效。 所以這個函數

void PrintLog(log_t log)
{
    printf("%s", log.field1);
}

調用未定義的行為。

似乎數據成員field1field2應該是字符數組而不是指針。

例如

typedef struct Log {
    char   field1[11];
    char   field2[9];
    //...

暫無
暫無

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

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