2015-04-28 109 views
2

我有以下方法:如何初始化數組並填充字符從緩衝區?

int create_nodes(Source* source, int maxTokens) { 
    int nodeCount = 0; 
    Token* p_Tstart = source->tknBuffer; 
    Token* p_Tcurrent = source->tknBuffer; 

    while ((p_Tcurrent - p_Tstart) < maxTokens && p_Tcurrent != NULL) { 
     int szWord = p_Tcurrent->t_L; 
     char word[szWord]; 
     // void *memset(void *str, int c, size_t n) 
     memset(word, '\0', sizeof(char)*szWord); 
     // void *memcpy(void *str1, const void *str2, size_t n) 
     char* p_T = source->buffer + p_Tcurrent->t_S; 
     memcpy(word, p_T, szWord); 

     if (word == ";") { 
      ++p_Tcurrent; 

      continue; 
     } 

     ++p_Tcurrent; 
     ++nodeCount; 
    } 
} 

source包含char*緩衝器。該方法的目的是首先計算緩衝區中不是;標記的所有標記(並且得出我們將需要多少個節點)。這裏是我使用的緩衝區:11 + 31;。令牌 - 由這點 - 已被創建如下:

  • 11
  • +
  • 31
  • ;

我通過在其中包含的開始的token*t_S)和長度(t_L)。所以,舉例來說,代表+焦炭令牌:

  • t->t_S = 3
  • t->t_L = 1

memcpy(...),調試器跳轉到++p_Tcurrent這意味着沒有被複制到word - 本質我猜想一個未捕獲的異常。我在做什麼錯誤初始化字數組?然後填寫令牌指定的特定信息?

source.h

struct source { 
    const char* fileName; 
    char* buffer; 
    int bufLen; 
    Token* tknBuffer; 
    Node* nodeBuffer; 
    Expression* exprBuffer; 
}; 

token.h

struct token { 
    int t_S; 
    int t_L; 
}; 
+0

請加入令牌和源類型聲明! –

回答

1

這是不對的。

if (word == ";") { 

這會比較兩個指針,並且很可能一直是錯誤的。

我懷疑你的意思是使用:

// Test whether the first character is a semicolon 
if (word[0] == ';') { 

// Test whether the entire word is a semicolon 
if (strcmp(word, ";") == 0) { 
+0

奇怪的是,儘管調試器似乎跳過了這條指令,但當我糾正它時,我能夠完成比較。 – IAbstract

+0

'strcmp'是否依賴'\ 0'終止* strings *? – IAbstract

+0

是的。沒有這些,你會冒着訪問越界內存的風險。 –