首页 文章

读取时读取分段错误[重复]

提问于
浏览
0

这个问题在这里已有答案:

我正在进行一项任务,其中一部分是使用系统函数 read() 从stdin读取,然后打印最后10行,到目前为止我已经得到了这个:

int tailSTD()
{
    char *lines = malloc(1);
    char buffer[10];
    int cmdCount = 0, buffCount, rState;
    while((rState = read(STDOUT_FILENO, buffer, 10)) > 0)
    {
        if(rState < 0)
        {
            if(errno == EINTR) rState = 0;
            else
            {
                perror("read()");
                return 0;
            }
        }
        else if (rState == 0) break;

        lines = realloc(lines, strlen(lines) + strlen(buffer));
        for(buffCount = 0; buffCount < strlen(buffer); buffCount++)
        {
            lines[cmdCount] = buffer[buffCount];
            cmdCount++; 
        }
    }
    printf("do we get this far?");
    printSTDLines(lines);
    return 0;
}

问题是我在循环的某个地方遇到了分段错误,我不确定在哪里,这与 fgets() 一起工作,我只是修改它只是因为它只是用 read() 来完成 . 它可能非常混乱,为此我道歉,但它必须以这种方式完成 . 我知道问题出在这里,因为它永远不会到达 printSTDLines 之前的 printf . 如果你需要,这里是 printSTDLines

void printSTDLines(char *lines)
{
    int lineCount = strlen(lines), newLineCount = 0;
    while(newLineCount < 10)
    {
        if(lines[lineCount] == '\n')
        {
            newLineCount++;
        }
        lineCount--;
    }
    int readSize = strlen(lines) - lineCount;
    for(lineCount = readSize; lineCount < sizeof(lines); lineCount++)
    {
        write(STDOUT_FILENO, &lines[lineCount], 1);
    }
}

1 回答

  • 1

    您正在使用 strlen(lines) ,但您永远不会 nul 终止它 . strlen() 函数需要找到一个 '\0' 字节来判断“字符串”的结尾位置,不要将该字节添加到任何数组中并调用未定义的行为,这可能导致分段错误 .

    还有,这个

    for(lineCount = readSize; lineCount < sizeof(lines); lineCount++)
    

    似乎错了, sizeof 运算符不适用于动态分配的数组,在这种情况下 lines 是一个指针,这意味着 sizeof 给你一个指针的大小,绝不是数组的长度,这显然是你想要的 .

    要在 printSTDLine() 中使用数组的长度,您需要将其作为参数传递 .

相关问题