【问题标题】:C code passing struct into function Stack overflowC代码将结构传递给函数堆栈溢出
【发布时间】:2012-03-05 20:32:12
【问题描述】:

好的,所以我对当前分配有疑问(相信我,这是其中很小的一部分),因为我们需要用 C 代码而不是 C++ 编写,并且我们不允许更改代码的某些部分.所以我定义了一个结构:

    typedef struct someStruct {
    int what;
    int something[MAX];
    int another[MAX];
} someType;

在 main() 中,我初始化了已定义结构中的所有值:

someType whatever, *whatptr;

编辑:当然设置指向结构的指针,试图简化示例的代码它已经存在于我的代码中

whatptr = &whatever;
whatever.what = 0;
// initialize both arrays to hold 0 at all indexes
// Then I must call a function progRun()
progRun();  //I need to pass struct 'whatever' in some way

现在 progRun() 看起来像这样:

void progRun(){
printWhat(&whatever);

    if (whatever.what == 0) {
    //do stuff 
    }
}

除了要在 progRun() 函数中传递的参数之外,我无法更改此代码中的任何内容,并且我可以在 printWhat() 之前添加内容。我尝试将 progRun 更改为

void progRun(someType *stptr)

然后在 main 中调用它

progRun(whatptr);

但是由于某种原因这会导致堆栈溢出问题,我尝试使用调试器单步执行,并且它仅在调用函数时发生。有没有更好的方法将“whatever”结构传递给函数,以便它可以传递到 progRun() 和 printWhat() 并可以访问“whatever.what”?

任何帮助将不胜感激!同时,如果可以的话,我会自己想办法。

编辑:即使在添加此代码之前,其他所有内容都已编译并运行得非常好,代码中也一定有其他问题。如果我可以分解代码并找出问题所在,我将更新问题。不,我不能发布整个代码,因为它是一个作业(这不是作业的目标,相信我,它专注于数据转发等等,只需要让这个基本的东西工作)谢谢大家的帮助。

编辑:结构中使用的 MAX 数,用于某事 [MAX] 和另一个 [MAX] 非常大(我离开了我的桌面,我在家里开始这个项目,我目前正在使用一台旧笔记本电脑,可以' t 处理大型数组)。下面的所有答案,以及我以前使用的一些东西现在都可以正常工作。

【问题讨论】:

  • 请发布一个演示问题的最小工作代码示例。
  • 您确定这是堆栈溢出而不是其他类型的崩溃吗?
  • 这里是错误:“程序.exe中0x004123f7处的未处理异常:0xC00000FD:堆栈溢出”,它在调用progRun()函数时发生。
  • @Doug 编译器没有告诉你导致溢出的确切行吗?

标签: c function struct stack-overflow


【解决方案1】:
void progRun(someStruct *ptr) {
    someStruct whatever2 = *ptr;
    printWhat(whatever2);
    if (whatever2.what == 0) { ...
}

whatptr = &whatever;
progRun(whatptr);

你的问题是:

  • 您需要传递一个指向 whatever 的指针,但您传递的是一个与 whatever 完全无关的变量 (whatptr)。

    您需要先将指针分配给指针变量中的任何内容。

  • 您没有取消引用函数中的指针

或者,去掉指针变量:

void progRun(someType *stptr) {
    printWhat(*stptr);
    if (stptr->what == 0) { ...
}

progRun(&whatever);

【讨论】:

  • 我忘了包括 whatptr = &whatever;在我的例子中,但这就是我之前所做的。这正是我遇到问题的地方,它在 progRun() 调用后崩溃
  • 感谢您的回复,但正如我所说,我无法更改指针变量。 printWhat 必须保留 printWhat(&whatever) 并且 if 语句必须保留 if(whatever.what)。我更喜欢按照你的方式做,因为我过去就是这样做的。有没有办法将指针设置回结构?
  • @Doug - 见答案的第二行。 SomeStruct whatever2 = *stptr;
  • @DVK 是的,只是注意到我实际上已经尝试过了,但是如果您也这么说,代码肯定有其他问题。我希望我可以发布我的完整代码,但由于显而易见的原因,我们无法在线发布作业。它很臭,这也只是其中的一小部分,但看起来我是一个人。我相信在这种情况下你会首先得到正确的答案,所以我会接受它。非常感谢。
  • @Doug - 尝试使用现有代码并将其缩减为最小的可运行子集。我们来看看
【解决方案2】:

说明

someType whatever, *whatptr;

是问题所在:

*whatptr 不会指向struct whatever,除非您按以下方式进行分配:

whatptr = &whatever;

或者,您可以使用malloc() 函数在堆上为指向struct whatever 的指针动态分配内存,并将malloc 返回的指针传递给函数progrun

whatptr = (someType*) malloc ( sizeof(someType) );
if (whatptr == NULL) exit (1);

//whatever you need to do with your code

progrun(whatptr); // call function like this

当然,在这种情况下,您需要使用箭头 -> 运算符取消引用您的指针以访问 struct 的成员元素:

whatpr->what = 0; // for example

此外,请查看这些教程以了解这两种方法:


如果您无法更改printif 语句,那么您应该将struct 的副本传递给您的函数:

void progRun( someType whatever ){ // <---Passing by copy
printWhat(&whatever);

    if (whatever.what == 0) {
    //do stuff 
    }
}

在你的main() 中你应该像这样调用函数:

someType whatever;
//assign values to members of the struct
progRun(whatever);

并且根本不需要定义和分配指向struct的指针。

虽然通过复制将变量传递给函数(尤其是当它们是由许多变量组成的对象时,例如 struct 是)不是一个好的行为:

  • 复制所有成员元素需要开销
  • 您的副本将具有有限的范围,这意味着您对函数内部变量所做的任何更改都将在您的函数结束时丢失,并且不会反映在主范围内的变量上

【讨论】:

  • 你不需要为一个 struct 动态分配内存,只需要一个指针。因为他有一个结构,所以他不需要那个。
  • @DVK 是的,输入错误..thks!
  • @Matteo 我输入示例不好,这已经包含在我的代码中。主要问题是如何在不改变 print 和 if 语句的情况下将其传递给函数。
  • @Doug 尝试通过复制传递结构,至少进行调试,它会让您了解问题是在打印功能中还是在其他地方。
  • @Matteo 我也试过了,我的代码中肯定有另一个问题。它编译没有错误。我相信你在正常情况下是正确的。我已经尝试了到目前为止提到的所有方法,并使用调试器逐步完成了代码。在进入实际代码之前调用 progRun() 时会发生错误。这就是为什么我认为这是我将结构添加到代码中的方式。我删除了打印功能并收到了同样的错误。
猜你喜欢
  • 2014-01-06
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2012-06-15
  • 2012-11-14
  • 2017-01-20
  • 2017-10-20
相关资源
最近更新 更多