-1

我正在运行一个程序,虽然代码运行良好,但 Valgrind 显示“大小为 1 的无效写入”并且地址 0x1ffefffa00 在线程 1 的堆栈上。使用程序中的另一个函数strchr和都发生了这种情况。strchrn

我尝试使用 index 来定位逗号以及strchr我的strchr函数,但都在 Valgrind 中不断返回相同的警告

typedef struct data_s Data;

struct data_s {
    float temperature;
    int year;
    int month;
    int day;

};

char* getData(FILE* filename) {
    char buffer[INPUT_LINE_MAX];
    char* dataLine = fgets(buffer, INPUT_LINE_MAX, filename);
    return dataLine;
}

Data* buildData(FILE* filename) {
    char* readLine = getData(filename);
    Data* new = malloc(sizeof(Data) + 1);
    char* comma1 = strchr(readLine, ',');

下面的其余代码comma1无关紧要

4

1 回答 1

1

一个问题是,在函数中,getData()您将返回一个指向缓冲区的指针,该缓冲区在函数返回后立即超出范围。

char buffer[INPUT_LINE_MAX];被声明为局部变量并将在堆栈上分配。当函数返回时,这个内存将不再被使用。因此,在您的程序中,在函数buildData()中,变量readLine指向堆栈上的一个位置,该位置可能至少部分被下一个函数调用覆盖

于 2019-08-29T07:19:57.390 回答