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

cvxl0en2  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(139)
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(跟踪/断点陷阱),有时它会工作。我不知道是什么问题,所以如果有人可以帮助请回复。我想修复这段代码,但如果你有一些其他的选择来使用它也将是好的,虽然我很想知道这是什么问题。谢谢
我试图修复这个问题,认为重新分配是问题所在,因为它在调试时指向realloc,但我无法修复它。该函数用作行读取器,有时工作有时不工作。

4jb9z9bj

4jb9z9bj1#

你有一个off-by-one错误,导致你的缓冲区永远不会变大。
首先为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;

您不需要担心空字节,因为在向当前最后一个分配的字节写入字符时,您已经扩展了缓冲区。

vddsk6oq

vddsk6oq2#

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

相关问题