Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 传递结构指针会毫无原因地导致整数溢出_C - Fatal编程技术网

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,[...]);