我試圖可視化這個練習的演算法,但我遇到了很多問題。
練習要求實作這個功能:
extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize);
- haystack 和 needle 是指向兩個不同記憶體區域的兩個指標。haystack 指向大小為 hsize 的記憶體,而 needle 指向大小為 nsize 的記憶體。
- 在 *haystack 中找到 *needle 元素,如果 *needle 元素也在 *haystack 中,則回傳一個指向新分配記憶體(包含 *needle 元素)的指標,該指標必須指向新記憶體的第 0 個元素。
我希望我對它的解釋比原來的練習更好(不清楚,所以我很難理解它)。
我試圖以這種方式繪制演算法:
演算法接受兩個指標及其大小。(回圈)在每一步將 *needle 加一以找到一個公共元素(將該元素與 haystack 的當前元素進行比較),如果該條件為真,則將計數器加一。通過這種方式,我獲得了最終陣列的長度。然后,我分配了足夠的記憶體,并執行另一個回圈來復制最終向量中的每個元素。最后但同樣重要的是,回傳這個指標。
這就是它在代碼中的樣子(我知道它不完整,但我目前正在逐步構建它,這并不容易):
#include <stdlib.h>
const void* memmem(const void* haystack, size_t hsize, const void* needle, size_t nsize) {
if ((hsize == 0) || (nsize = 0)) {
return NULL; // here, I should've done a NULL pointer exception check too, because haystack and needle may be null pointer too. for now, ignore that.
}
for (size_t i = 0; i < nsize; i ) {
if (needle[i] == haystack[i])
}
}
int main(void) {
int haystack[] = {-1, 0, 1, 2, 3, 4};
size_t hsize = 6;
int needle[] = {-1, 8, 4, 2};
size_t nsize = 4;
int* ptr = memmem(haystack, hsize, needle, nsize);
return 0;
}
關鍵部分在這里:
for (size_t i = 0; i < nsize; i ) {
if (needle[i] == haystack[i])
}
因為我有這個錯誤:運算式必須是指向完整物件型別的指標。這是什么意思?我以前從未聽說過此錯誤訊息。陣列是完整的,我已經正確定義了它們,因此我不知道為什么我有它。
uj5u.com熱心網友回復:
型別 void 是不完整型別。它的大小是未知的。編譯器不可能確定該型別物件的大小(盡管為了向后兼容,一些編譯器有它們自己的擴展來確定 sizeof(void) 等于 1。但這不滿足 C 標準)。
來自 C 標準(6.2.5 型別)
19 void 型別包含一組空值;它是無法完成的不完整物件型別。
所以你不能取消參考 cv void * 型別的指標。您需要將指標轉換為指向完整物件型別的指標才能訪問指向的物件。
在任何情況下,這個 for 回圈
for (size_t i = 0; i < nsize; i ) {
if (needle[i] == haystack[i])
}
即使指標被強制轉換也是不正確的,因為nsize并且hsize可能不相等。
我認為你需要兩個嵌套的 for 回圈。
至少還有const函式回傳型別中的限定符
extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize);
沒有多大意義。它應該被洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470451.html
上一篇:建議在指標處臨時反轉資料然后將指標傳遞給臨時反轉資料的格式
下一篇:指標中的奇怪錯誤
