This question already has answers here:
Return a string from function to main
                                
                                    (3个答案)
                                
                        
                                6个月前关闭。
            
                    
我正在运行一个程序,尽管代码工作正常,但Valgrind显示的是'1号无效写入',并且地址0x1ffefffa00在线程1的堆栈上。这是使用strchrstrchrn发生的在程序中。

我尝试使用索引来定位逗号以及strchrstrchr函数,但是在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下面的其余代码无关

最佳答案

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

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

关于c - C strchr在valgrind中导致“大小为1的无效读取” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57704932/

10-11 16:22