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,但我无法修复它。该函数用作行读取器,有时工作有时不工作。
2条答案
按热度按时间4jb9z9bj1#
你有一个off-by-one错误,导致你的缓冲区永远不会变大。
首先为2个字符分配空间:
然后将
sizeOfLine
设置为1,试图为空字节保存空间。以后重新分配时:
由于
sizeOfLine
为1,因此您分配了2个字节的空间,这是您之前的空间。然后更新sizeOfLine
:而2*1-1是1,所以
sizeOfLine
也不会改变。因此,您需要让
sizeOfLine
包含缓冲区的实际大小:您不需要担心空字节,因为在向当前最后一个分配的字节写入字符时,您已经扩展了缓冲区。
vddsk6oq2#
sizeOfLine永远保持1,在读取第二个字符后,您将所有其他字符存储在越界内存中,因为您的缓冲区始终具有大小2。