我的范围问题需要帮助。
我有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...
}
问题是我的缓冲区中的值没有保留......为什么不呢?
请注意,这不是'按值调用'问题,因为我没有将结构作为参数传递给任何函数。
答案 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'
,因此strncat
或snprintf
可能更容易使用。)