2015-11-16 70 views
0

我有一個奇怪的問題,我不知道原因,所以我想不出解決方案來修復它。如果我將數組作爲參數傳遞,從數組中移除結構的函數不起作用

我的問題:

我有一個removeEntry功能與結構的數組作爲參數,但不知何故,此功能不起作用。

在我的代碼的早期版本中,我在main函數之外(每個函數之外)聲明瞭我的結構數組,然後它就起作用了。但是因爲我現在在我的main函數中創建了我的struct數組,所以我必須將它作爲參數,現在我的removeEntry函數不起作用。

代碼不工作:

void removeEntry(struct entry entries[]) 
{ 
    int entryNumber; 
    int nrBytes = sizeof(entries); 
    int arrayLength = nrBytes/sizeof(entries[0]); 
    printf("\nEnter entry number to delete: "); 
    scanf("%d",&entryNumber); 
    while (scanfOnlyNumber(entryNumber) == false || entryNumber == 0 || entries[entryNumber].entry_number == 0) 
    { 
     printf("\nEnter a legit entry number to delete: "); 
     scanf("%d", &entryNumber); 
     // Tell the user that the entry was invalid 
    } 
    int i = 0; 
    for(i = entryNumber; i < arrayLength - 1; i++) 
    { 
     entries[i] = entries[i + 1]; //removes element and moves every element after that one place back. 
    } 
    updateEntryNumber(entries); 
    printf("\nEntry %d removed succesfully, and entry numbers updated!\n", entryNumber); 
} 

我的老師告訴我,當我創建我的結構的數組我main函數中(就是我現在做的)我arraylength計算不起作用, 但我不知道爲什麼它不起作用。如果有人可以解釋,那麼我可以自己修復我的問題removeEnty

如果有人想要工作代碼(我不給我的數組作爲參數,因爲我在每個函數外部創建我的數組),然後告訴我,我會發布它。

+1

'的sizeof(條目)'是一個表示地址的大小數組參數'struct entry entries []'。它沒有給出數組的實際長度(這是參數未知的)。您需要將數組的長度作爲單獨的參數傳遞(或者有辦法「查找」最後一個條目)。 – lurker

回答

2

問題

當傳遞數組給函數,不傳遞整個陣列,而不是傳遞的指針數組。因此,當你做int nrBytes = sizeof(entries);時,你實際上得到了指針變量的大小而不是數組的大小。

傳遞您的陣列長度的指針數組函數沿,是這樣的:

void removeEntry(struct entry entries[], int arrayLength){ 
    // your code 
} 
0

您應該傳遞數組的大小來運行,因爲int nrBytes = sizeof(entries);始終是4或8(在x64系統上)。這只是指針的大小。

1
int nrBytes = sizeof(entries);  // basically size of struct node * 
int arrayLength = nrBytes/sizeof(entries[0]); 

在這個sizeof(entries)會給在第二份聲明結構指針的大小,而不是該數組,而且,它不會正確。

這是因爲在將數組傳遞給函數並引用它之後,數組會衰減到指針。

您需要做的是計算main中struct array的元素數量,然後將其傳遞給該函數。

void removeEntry(struct entry entries[],int arrayLength); 

計算arrayLengthmain爲你做。

+0

謝謝!是的,我正在嘗試一些事情,那爲什麼我編輯第二次調用「條目[0]」 – washichi

+0

@ user3590152是的,但是如果你從main傳遞它,這將是有幫助和正確的。 – ameyCU

1

如果你編譯你的例子,你可能會看到一個警告,像這樣的:

warning: sizeof on array function parameter will return size of 'entry *' instead of 'entry []' [-Wsizeof-array-argument] 

正如五克拉夫琴科在回答指出,這表明nrBytes將包含指針的只是大小,而sizeof(entries[0])返回整個結構的「真實」大小。因此,arrayLength很可能爲零。

0
int nrBytes = sizeof(entries); 

任何類型的數組(甚至結構數組)都會在傳遞給函數時衰減爲指針。這個指針的長度總是固定的,並沒有給出長度的任何指示。所以傳遞函數調用的長度。

相關問題