C代码将struct传递给函数Stack溢出

时间:2012-03-05 20:32:12

标签: c function struct stack-overflow

好的,所以我遇到了当前任务的问题(相信我这是一个微不足道的部分),因为我们需要用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处理大型数组)。下面的所有答案,以及我之前使用的一些东西现在都可以正常工作。

2 个答案:

答案 0 :(得分:1)

void progRun(someStruct *ptr) {
    someStruct whatever2 = *ptr;
    printWhat(whatever2);
    if (whatever2.what == 0) { ...
}

whatptr = &whatever;
progRun(whatptr);

你的问题是:

  • 您需要将指针传递给whatever,但您传递的变量(whatptr)与whatever完全无关。

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

  • 您没有取消引用功能

  • 中的指针

或者,摆脱指针变量:

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

progRun(&whatever);

答案 1 :(得分:0)

指示

someType whatever, *whatptr;

是问题所在:

*whatptr不会指向struct whatever,除非您执行以下任务:

whatptr = &whatever;

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

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 print语句,则应将您的if副本传递给您的函数:

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时)不是一个好的行为:

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