为什么 C 中的这个 readLine() 函数不工作,返回 SIGTRAP?

问题描述 投票:0回答:2
char * readLine(){
    char c;
    char* line = (char*) malloc(2* sizeof(char));
    if(line == NULL){
        printf("MEM_GRESKA");
        exit(1);
    }
    int sizeOfLine = 2 - 1; //-1 za \0
    int numOfChars = 0;

    scanf("%c",&c);
    while(c != '\n'){
        numOfChars++;
        if(numOfChars >= sizeOfLine){

            line = (char*) realloc(line, 2*sizeOfLine * sizeof(char) );//THIS IS BOLDED WHEN
                                                                       //DEBUGGING
            if(line == NULL){
                printf("MEM_GRESKA");
                exit(1);
            }
            sizeOfLine = 2*sizeOfLine - 1; //-1 for \0
        }
        line[numOfChars - 1] = c;
        scanf("%c",&c);
    }
    line[numOfChars] = '\0';
    line = (char*) realloc(line, (numOfChars + 1) * sizeof(char));
    if(line == NULL){
        printf("MEM_GRESKA");
        exit(1);
    }
    return line;
}

当我运行这段代码时,有时会出现错误SIGTRAP(跟踪/断点陷阱),有时它会起作用。我不确定是什么问题,所以如果有人可以提供帮助,请回复。 我想修复此代码,但如果您有其他选择也可以使用它,尽管我很想知道这有什么问题。谢谢

我试图解决这个问题,认为重新分配是问题所在,因为它在调试时指向重新分配,但我无法解决它。该功能用作行阅读器,有时有效有时无效。

c segmentation-fault readline
2个回答
1
投票

你有一个差一错误导致你的缓冲区永远不会变大。

您从为 2 个字符分配空间开始:

char* line = (char*) malloc(2* sizeof(char));

然后将

sizeOfLine
设置为1,试图为空字节节省空间。

int sizeOfLine = 2 - 1; 

当你以后重新分配时:

line = (char*) realloc(line, 2*sizeOfLine * sizeof(char) );

由于

sizeOfLine
为1,你分配了2个字节的空间,这是你之前的。然后你更新
sizeOfLine

sizeOfLine = 2*sizeOfLine - 1; 

而 2*1-1 是 1,所以

sizeOfLine
也不会改变。

所以你想要的是让

sizeOfLine
包含缓冲区的实际大小:

int sizeOfLine = 2;
...
sizeOfLine = 2*sizeOfLine; 

您无需担心空字节,因为只要您将字符写入当前最后分配的字节,您就已经扩展了缓冲区。


0
投票

sizeOfLine 永远保持 1,在读取第二个字符后,您将所有其他字符存储在越界内存中,因为您的缓冲区一直具有大小 2。

© www.soinside.com 2019 - 2024. All rights reserved.