C strchr引起的“;大小为1的读取无效;在瓦尔格林

C strchr引起的“;大小为1的读取无效;在瓦尔格林,c,pointers,valgrind,dynamic-memory-allocation,strchr,C,Pointers,Valgrind,Dynamic Memory Allocation,Strchr,我正在运行一个程序,虽然代码运行正常,但Valgrind显示“大小为1的无效写入”,并且地址0x1FFFFFA00位于线程1的堆栈上。这是使用程序中的另一个函数strchr和strchrn实现的 我已经尝试使用index来定位逗号,以及strchr和我的strchr函数,但它们都在Valgrind中返回相同的警告 typedef struct data_s Data; struct data_s { float temperature; int year; int mo

我正在运行一个程序,虽然代码运行正常,但Valgrind显示“大小为1的无效写入”,并且地址0x1FFFFFA00位于线程1的堆栈上。这是使用程序中的另一个函数
strchr
strchrn
实现的

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

typedef struct data_s Data;

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


下面代码的其余部分与comma1无关

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


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

非常感谢!我改变了我的代码,它工作了!
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, ',');