【问题标题】:Segmentation fault when calling strcpy function调用 strcpy 函数时出现分段错误
【发布时间】:2018-12-15 10:10:45
【问题描述】:

我正在尝试解决一个练习 5.7。来自 ANSI C 书:

练习 5.7。重写 readlines 以将行存储在 main 提供的数组中,而不是调用 alloc 来维护存储。程序快多少?

这是我的以下代码:

#include <stdio.h>
#include <string.h>

#define ALLOCSIZE 10000
#define MAXBUF 10000
#define MAXLEN 1000
#define MAXLINES 5000

char * lineptr[MAXLINES];

static char allocbuf[ALLOCSIZE];
static char * allocp = allocbuf;

int readlines(char * lineptr[], int nlines);
void writelines(char * lineptr[], int nlines);

int mygetline(char *, int);

void qsort(char * lineptr[], int left, int right);
void swap(char * v[], int i, int j);

int main(void) {
    int nlines;

    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
        qsort(lineptr, 0, nlines - 1);
        writelines(lineptr, nlines);
    } else {
        printf("error: input too big to sort\n");
        return 1;
    }
    return 0;
}

int readlines(char * lineptr[], int maxlines) {
    int len, nlines;
    char line[MAXLEN];

    nlines = 0;
    while ((len = mygetline(line, MAXLEN)) > 1) {
        if (nlines >= maxlines || len == 0)
            return -1;
        else {
            line[len - 1] = '\0';
            strcpy(lineptr[nlines++], line);
        }
    }
    return nlines;
}

void writelines(char * lineptr[], int nlines) {
    while (nlines-- > 0)
        printf("%s\n", *lineptr++);
}

int mygetline(char s[], int lim) {
    int c, i;

    i = 0;
    while (--lim > 0 && (c = getchar()) != EOF && c != '\n')
        s[i++] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';
    return i;
}

void qsort(char * v[], int left, int right) {
    int i, last;

    if (left >= right)
        return;
    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++)
        if (strcmp(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort(v, left, last);
    qsort(v, last + 1, right);
}

void swap(char * v[], int i, int j) {
    char * temp;

    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

我无法弄清楚这个练习。我在 strcpy(lineptr[nlines++], line); 指令的 readlines 函数中遇到错误。我不知道为什么这条指令会导致分段错误错误。任何人都可以推荐如何修复分段错误或提出此练习的另一种解决方案吗?

【问题讨论】:

  • char * lineptr[MAXLINES]; 不会为字符串本身保留任何空间。您正在将字符串复制到未初始化的指针
  • 我将char * lineptr[MAXLINES]; 更改为char * lineptr[MAXLINES] = { '\0' }; 仍然出现分段错误错误。
  • 初始化为 0 对你没有任何好处。您需要分配内存。
  • 那是因为'\0' 等价于NULL 拯救你的唯一方法是当你 free 一个 NULL 指针时,这是良性的。

标签: c


【解决方案1】:
char * lineptr[MAXLINES];

声明一个指针数组没问题,但不初始化任何字符串。

所以当做

strcpy(lineptr[nlines++], line);

您正在使用一个未初始化的指针复制数据,该指针指向一个随机内存位置,导致... 未定义的行为

相反,分配一些内存:

char *copy = malloc(strlen(line)+1);
strcpy(copy,line);
lineptr[nlines++] = copy;

或者只是

lineptr[nlines++] = strdup(line);

最后你必须free那些。

检查nlines &lt; MAXLINES

【讨论】:

  • 天哪!我忘了我应该使用 strdup 而不是 strcpy。非常感谢:)
  • strcpy 无论如何都无法修改传递的指针。这就是为什么strdup 返回一个指针,它必须分配给你的值
猜你喜欢
  • 2018-03-17
  • 2020-04-20
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多