我试着写了这段代码,但是我发现了memcpy的分段错误(我试着用debug查看代码)

        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(分段错误)。有人有什么建议吗?
谢谢。
当做。

最佳答案

您的代码至少有两个问题:第一,它使用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++;

关于c - memcpy,段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26665069/

10-16 17:25