为什么回调函数不更改全局结构中的值?

why doesn't the callback function change a value in a global struct?

提问人:loaded_dypper 提问时间:9/13/2022 更新时间:9/13/2022 访问量:37

问:

我调用了这个结构,其中包含指向数组的指针和该数组的长度,现在当调用回调函数时,它确实将输出复制到分配的缓冲区中,但 len 没有改变StringchargrabOutputptr

#define  BUF_SIZE 1024

typedef struct String
{
    char * ptr;
    int len;
} String;


HANDLE Child_IN_R = NULL;
HANDLE Child_IN_W = NULL;
HANDLE Child_OUT_R = NULL;
HANDLE Child_OUT_W = NULL;
HANDLE handle = NULL;                
String str;
DWORD grabOutput(LPVOID lpParam )
{
    BOOL success = FALSE;
    DWORD dwRead, total =0;
    char buffer[BUF_SIZE];
    while(1)
    {
        success = ReadFile(Child_OUT_R, buffer, BUF_SIZE, &dwRead, NULL);
        if (!success) break;
        memcpy(str.ptr+total, buffer, dwRead);
        total += dwRead;
        str.ptr = realloc(str.ptr, total+BUF_SIZE); 
    }
    str.len = total; // this does not change the value of str.len 
    return 0;
}

为什么这段代码不改变全局的值?str.lenString str

c struct 回调 全局变量

评论

4赞 Some programmer dude 9/13/2022
您似乎在为 分配内存之前正在这样做。这会导致未定义的行为。更改 和 调用的顺序。memcpy(str.ptr+total, buffer, dwRead)str.ptrmemcpyrealloc
0赞 loaded_dypper 9/13/2022
@Someprogrammerdude我也应该 null 终止它,但这不是这里的主要问题
0赞 the busybee 9/13/2022
您是否使用调试器单步执行代码并观察变量?你看到了什么?您甚至可以查看生成的程序集。
0赞 Some programmer dude 9/13/2022
从您显示的代码中,将以 null 指针开始。该调用将取消引用 null 指针,从而导致未定义的行为。如果您显示的内容不是适当的最小可重现示例,请创建一个并编辑您的问题以显示它。str.ptrmemcpy
1赞 Jerry Jeremiah 9/13/2022
@loaded_dypper 未定义的行为始终是主要问题。如果存在未定义的行为,编译器可以自由地做任何它想做的事情——包括崩溃、提前退出函数、继续执行代码,就好像代码是正确的一样,甚至是时间旅行 devblogs.microsoft.com/oldnewthing/20140627-00/?p=633 因此,如果存在任何未定义的行为,你就无法推理代码为什么要做任何事情。

答: 暂无答案