2015-10-03 30 views
1
#include "stdafx.h" 
#include <ctype.h> 
#include <limits.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <string.h> 

//typedef struct kvNode kvNode; 

struct kvNode 
{ 
    char cKey[32]; 
    uint32_t iValue; 
    struct kvNode *NEXT; 
}; 

//Function declarations 
void put(char *key[], int *value); 
uint32_t get(char *key[]); 
int del(char *key[]); 
uint32_t hashkey(char *key); 
void strUpper(char *); 

const int arraylen = 10; //length of key array 
kvNode *keys[]; //our key array 

int main() 
{ 
    //Create array of pointers to kvNodes 
    keys[arraylen] = { NULL }; 
    return 0; 
} 

我敢肯定,這是代碼塊返回錯誤。在構建時發生錯誤,並是:LNK 2001:Unresolve外部符號struct **

1> keyValue.obj:錯誤LNK2001:解析外部符號 「結構kvNode * *鍵」(?鍵@@ 3PAPAUkvNode @@ A)

我試圖做的是在C中練習一個關鍵值存儲(無疑地使用更多的,我們應該說,放鬆語言最近已經鈍了我的C刀),所以我定義了一個鍵值節點struct,然後是一個指針數組到那些節點。在關於向前聲明struct的其他問題上,我得到了用於聲明結構體內結構指針的語法,但由於某種原因編譯器(Vis Studio)在未解析的外部符號上咳嗽,我不知道爲什麼。

+0

的根是這一行:'kvNode *鍵[]; //我們的鍵陣列就像編譯程序時一樣?你已經在typedef的行上註釋了,所以這行應該是'struct kvNode * keys []; //我們的關鍵數組「,但是那麼你的鏈接器會發出一個關於'struct kvNode ** keys'的錯誤,這個錯誤在你的源代碼中不存在。那麼,這是產生錯誤的實際代碼嗎? –

+0

是的,克里已經明白了,編譯器需要知道數組的大小,這是有道理的,但我必須爲我的程序走另一個不同的方向。 – MDMoore313

回答

2

您需要。如果大小不是在編譯時已知此陣kvNode *keys[]; //our key array

聲明大小,編譯器如何編譯它?它被聲明爲具有靜態生命週期,所以必須給它一個固定的大小,一個固定的二進制內存塊。我認爲編譯器將上面的行解釋爲聲明而不是定義,因此鏈接錯誤。

+0

有意義,也許我需要問一個單獨的問題,但如果在程序運行之前不知道大小怎麼辦? – MDMoore313

+0

那麼,在這種情況下,你應該使用malloc在堆上分配它,或者如果你的編譯器支持可變長度數組,你可以在堆棧上分配它(作爲函數中的局部變量)。你沒有說你正在使用什麼C標準。 –

+0

是的,做過竅門,明顯可以在9分鐘內接受。我將不得不看看默認情況下Vis Studio編譯的標準,但是這指向了我正確的方向,謝謝。 – MDMoore313

0

這是編譯時問題,而不是鏈接時間問題。與此行:

kvNode *keys[]; 

這有幾個問題。

首先,語法不正確:它應該是:

struct kvNode *keys[]; 

但是,這不處理這下一行,因爲編譯器將默認爲僅單個項目大小的按鍵[]

keys[arraylen] = { NULL }; 

建議:

struct kvNode *keys[ arraylen ]; 

即使那麼,此行:

keys[arraylen] = { NULL }; 

正在嘗試設置將超過指針數組末尾的鍵[10]。因爲在C中,數組索引從0開始而不是1,因此鍵[]的有效索引爲0 ... 9

強烈建議在編譯時始終啓用所有警告,然後修復這些警告。

強烈建議從鏈接步驟分別進行編譯步驟,以便可以很容易地確定該步驟實際上包含一個問題

相關問題