读取时读取分段错误

时间:2016-01-18 22:01:55

标签: c function segmentation-fault system

我正在进行一项任务,其中一部分是使用系统函数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()一起使用,我只是修改它只是因为它只是用{{1 }}。它可能非常混乱,为此我道歉,但它必须以这种方式完成。我知道问题就在这里,因为它永远不会到read()之前的printf。 如果您需要,请printSTDLines

printSTDLines

1 个答案:

答案 0 :(得分:1)

您正在使用strlen(lines),但绝不会nul终止它。 strlen()函数希望找到一个'\0'字节来告诉&#34; 字符串&#34;是的,您不会将该字节添加到任何数组并调用未定义的行为,这可能导致分段错误。

另外,这个

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

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

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