2014-10-30 31 views
0

我必須嘗試寫這樣的代碼,但我發現用的memcpy段故障問題(我已經嘗試看看與調試代碼)的memcpy,分段錯誤

 FILE *tp; 
     int l = 0; 
     while ((fgets(buffer, sizeof buffer, tp))) { 
      // search equal sign 
      char *equalsign = strchr(buffer, '='); 
      l++; 
      // search quote near value 
      char *q1 = equalsign + 1; 
      char *q2 = strchr(q1 + 1, '"'); 
      // extract name and value 
      char* names = strndup(buffer, equalsign - buffer); 
      char* values = strndup(q1 + 1, q2 - q1 - 1); 
      memcpy(g_names,names,strlen(names)); 
      memcpy(g_values,values,strlen(values)); 
      free(names); 
      free(values); 
      } 

const char* g_names[SIZE] = { 0, }; 
char* g_values[SIZE] = { 0, }; 
char buffer[MAXLINE] = {0,}; 

定義爲全局。與調試我已經看到問題是與memcpy(分段錯誤)。任何人有建議? 謝謝。 此致敬禮。

+0

'memcpy(g_names,names,strlen(names));'會**總是**導致一個未終止的字符串。 – wildplasser 2014-11-02 15:47:17

回答

3

您的代碼至少有兩個問題:首先,它使用g_names作爲memcpy的目標,它將字符複製到指針數組上。您應該複製到g_names[l](假設lg_names陣列中的索引)。

其次,你的代碼丟失的g_names[l]實際分配,喜歡的東西:

g_names[l] = malloc(strlen(names) + 1); 

但既然你打電話strndup反正,你可以簡單地存儲調用到陣列的結果:

 // search for equal sign 
     char *equalsign = strchr(buffer, '='); 
     // search quote near value 
     char *q1 = equalsign + 1; 
     char *q2 = strchr(q1 + 1, '"'); 
     // extract name and value 
     g_names[l] = strndup(buffer, equalsign - buffer); 
     g_values[l] = strndup(q1 + 1, q2 - q1 - 1); 
     l++; 
+0

它是完美的。我希望這不是一個愚蠢的問題。我已經嘗試了整個下午,但是我還沒有想法修復它 – david 2014-10-30 23:34:56

+0

@david好吧,嚴格來說,這些問題不應該是關於調試特定的代碼問題,但它不是*愚蠢的*。此外,如果問題得到解決,請不要忘記[接受](http://meta.stackexchange.com/a/5235)答案。 – user4815162342 2014-10-30 23:45:08

+0

另一個問題是'memcpy(g_names,'...很糟糕,那就是遍佈一些指針 – 2014-10-31 01:19:50