2014-10-30 124 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