C 传递结构指针会毫无原因地导致整数溢出
注:在写这个问题的过程中,我自己解决了这个问题。令人惊讶的是,仅仅写一个问题,包括细节,往往可以帮助一个人解决自己的问题。更不用说阅读C 传递结构指针会毫无原因地导致整数溢出,c,C,注:在写这个问题的过程中,我自己解决了这个问题。令人惊讶的是,仅仅写一个问题,包括细节,往往可以帮助一个人解决自己的问题。更不用说阅读-Wall的输出了 尽管如此,我仍然在发布这篇文章,以便将来有这个问题的人能够自己解决它 如果你认为我应该这样做,请告诉我 原问题: 出于某种原因,当我通过两个函数传递结构指针时,它似乎会扭曲其中的数据 我对此束手无策。也许这对我这样的傻瓜来说是一个雄心勃勃的项目,但尽管如此,我似乎不明白为什么会发生这种情况 以下是一些相关的代码片段: 根据数据h: typed
-Wall
的输出了
尽管如此,我仍然在发布这篇文章,以便将来有这个问题的人能够自己解决它
如果你认为我应该这样做,请告诉我
原问题: 出于某种原因,当我通过两个函数传递结构指针时,它似乎会扭曲其中的数据 我对此束手无策。也许这对我这样的傻瓜来说是一个雄心勃勃的项目,但尽管如此,我似乎不明白为什么会发生这种情况 以下是一些相关的代码片段: 根据数据h:
typedef struct data{
unsigned int dollar_bank : 32;
unsigned int dollar_bank_extra : 32;
// 13 more ints
} data;
void file_save(data *d, char *file);
数据c:
void file_save(data *d, char *file){
FILE *f = fopen(file,"w");
fprintf(f,
"%05i,%05i,[...]%05i",
d->dollar_bank,
d->dollar_bank_extra,
// etc
);
fclose(f);
}
主要条款c:
render(&d);
prompt(&d);
data_save(&d,"data"); // Saves correctly
接口c:
static void exec_command(data *d, char *cmd, int *exit_code){
// Here I have this debug line,
printf("%i\n",d->dollar_bank);
// supposed to print 1000 (as it does in main())
// but prints a random number like -1246981692364 instead
// if I invoke file_save() here, it writes garbage into the file. Not very useful.
}
void prompt(data *d){
char cmd[5];
int exit_code = 0;
while(1){
// ...
exec_command(&d, cmd, &exit_code);
if(exit_code) break;
}
}
我将非常感谢在这方面可能给予的任何帮助。我觉得我错过了一些非常明显的东西。如果您需要更多的代码片段,请询问
编译器=GCC 4.7.3
编译器输出:
interface.c: In function ‘exec_command’:
interface.c:102:5: warning: passing argument 1 of ‘file_save’ from incompatible pointer type [enabled by default]
In file included from interface.c:3:0:
data.h:22:6: note: expected ‘struct data *’ but argument is of type ‘struct data **’
interface.c: In function ‘prompt’:
interface.c:123:5: warning: passing argument 1 of ‘exec_command’ from incompatible pointer type [enabled by default]
interface.c:93:6: note: expected ‘struct data *’ but argument is of type ‘struct data **’
interface.c:121:10: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result [-Wunused-result]
我很确定我错过了一些非常明显的东西。当我复制GCC的输出时,我想到了解决方案(当然是使用
-Wall
)
我想了想,意识到我遗漏了一件非常明显的事情:将&d
(原始结构的地址)传递到另一个函数,将指向一个地址的地址。据我所知,甚至不是一个有效的指针,但它仍然被解释为struct data**
。这意味着使用saving函数,我传递的是结构数据***
解决方案非常简单,只需更改:
exec_command(&d,[...]);
到
所以现在它不再打印-12345474293845
,而是打印1000
。万岁
同样,如果你认为我应该回答这个问题,请告诉我。然后人们可以把他们的知识添加到指针对指针的主题上
或者,如果您认为我应该删除此问题/答案,请告诉我。我不想踩到任何人的脚趾。对我来说,这完全可以。回答自己的问题是一种受鼓励的行为,你显然是出于善意才发表这篇文章的:-)我唯一想到的是,在几天内,你接受自己的答案,这样问题就不会一直悬而未决(没有被接受的答案)。@Streppel谢谢你让我知道!我会确保做到这一点。只要堆栈溢出允许我。虽然如果有一个更详细的更好的答案出现,我肯定会接受这个答案。另外,我很好奇当你传递一个“地址中的地址”时会发生什么。电话号码在哪里?为什么它没有崩溃?为什么编译器不抛出一个完整的错误?
exec_command(&d,[...]);
exec_command(d,[...]);