memcpy,分段错误

时间:2014-10-30 23:17:26

标签: c linux

我试着写这段代码,但是我发现了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(分段错误)。有人有建议吗? 谢谢。 问候。

1 个答案:

答案 0 :(得分: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++;