簡體   English   中英

C代碼將結構傳遞給函數堆棧溢出

[英]C code passing struct into function 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)

然后在主叫它

progRun(whatptr);

但這由於某種原因導致了堆棧溢出問題,我嘗試使用調試器逐步解決,並且僅在調用函數時發生。 有沒有更好的方法可以將“ whatever”結構傳遞給函數,以便可以將其傳遞給progRun()和printWhat()並可以訪問“ whatever.what”?

任何幫助將不勝感激! 同時,如果可以的話,我會嘗試自己解決。

編輯:即使在添加了此代碼之前,其他所有內容都已編譯並運行得很好,但代碼中的其他內容肯定是錯誤的。 如果我可以分解代碼並找出問題所在,則將更新該問題。 而且不行,我無法發布整個代碼,因為這是一個任務(這不是任務的目標,相信我它專注於數據轉發等等,只需要使此基本功能正常工作即可)謝謝大家的幫助。

編輯:結構中用於某[MAX]和另一個[MAX]的MAX數非常大(我離開桌面時回到家中開始了該項目,我目前使用的是舊筆記本電腦,無法處理較大的數據數組)。 下面的所有答案以及我之前使用過的一些東西現在都可以正常工作。

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);

指令

someType whatever, *whatptr;

是問題所在:

*whatptr不會指向struct whatever ,除非你做的任務如下:

whatptr = &whatever;

另外,您可以動態地分配在堆上的一個指針,你的記憶struct whatever使用malloc()函數並傳遞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 )組成的對象)不是一個好習慣:

  • 復制所有成員元素將需要開銷
  • 您的副本將具有有限的作用域,這意味着您對函數內部變量所做的任何更改都將在函數結束時丟失,並且不會反映在主作用域的變量上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM