-3

我的范围有问题,需要帮助。

我有 2 个源文件和一个头文件:main.c、parser.c 和 parser.h

在 parser.h 中:

struct buffer{
    char member1[30];
    char member2[20];
    char member3[20];
    char member4[20];
}buf;
void parse(char* line);

在 parser.c 中:

void parse(char* line){
    clear_buf(); //I clear my current buffer before running this function
    char temp[30];
// .... some code which copies from my line into my temporary buffer (temp)
// .... some code which decides which of my buffers I want to copy this to
strcpy(buf.member1,temp);
//Check the addresses- the struct buf is the same, the member is not:
//printf("buffer INSIDE function %p\n",&buf.member1);
//printf("STRUCT BUF, INSIDE function %p\n",&buf);
// at THIS point, when checking, buf.member1 does have the correct data copied into it
}

在 main.c 中:

while(fgets(line,100,fp)!=NULL){
    /*parse the line into our internal buffer*/
    parse(line);
    //check addresses in main- buf.member1 is different, but the struct buf is the same
    //printf("STRUCT BUF, in main %p\n",&buf);
    //printf("buffer in main %p\n",&buf.member1);
    //rest of code...
    }

问题是我的缓冲区中的值没有被保留......为什么不呢?

请注意,这不是“按值调用”问题,因为我没有将结构作为参数传递给任何函数。

4

1 回答 1

0

由于您未显示的代码中的错误,很可能不会保留值...我怀疑是否有人有足够的洞察力,可以在没有看到错误代码的情况下进行猜测。

因此,请改为使用一些调试提示:

  • 只需使用调试器,单步执行代码,然后将缓冲区放到手表上,这样您就可以看到它的值何时发生变化(因为如果不保留它肯定必须更改)。

  • 如果调试器有问题,请尝试printf("buf at line %d: %p\n", __LINE__, &buf);调试所有相关位置的语句,以确保您确实在同一个结构实例上运行。

  • 如果调试器有问题,请尝试printf("buf strings at line %d: '%30s' '%20s' '%20s' '%20s'\n", __LINE__, buf.member1, buf.member2, buf.member3, buf.member4);调试所有相关位置的语句以查看值如何变化。

  • 确保字符串确实是以 '\0' 结尾的。

  • 当您进行字符串复制时,不要让目标缓冲区溢出,使其不可能以一种或另一种方式发生(注意:使用strncpy时要小心,不保证添加终止'\n',因此strncatsnprintf可能更容易使用)。

于 2013-03-09T10:32:38.280 回答