[英]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
另外,請查看這些教程以了解這兩種方法:
如果您不能更改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
的指針。
盡管通過復制將變量傳遞給函數(尤其是當它們是由許多變量(例如struct
)組成的對象)不是一個好習慣:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.