在C-不正确范围内使用char数组成员进行结构化

时间:2013-03-09 09:12:07

标签: c arrays struct scope

我的范围问题需要帮助。

我有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...
    }

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

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

1 个答案:

答案 0 :(得分: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' -terminated。

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