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(跟踪/断点陷阱),有时它会起作用。我不确定是什么问题,所以如果有人可以提供帮助,请回复。 我想修复此代码,但如果您有其他选择也可以使用它,尽管我很想知道这有什么问题。谢谢
我试图解决这个问题,认为重新分配是问题所在,因为它在调试时指向重新分配,但我无法解决它。该功能用作行阅读器,有时有效有时无效。
你有一个差一错误导致你的缓冲区永远不会变大。
您从为 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;
您无需担心空字节,因为只要您将字符写入当前最后分配的字节,您就已经扩展了缓冲区。
sizeOfLine 永远保持 1,在读取第二个字符后,您将所有其他字符存储在越界内存中,因为您的缓冲区一直具有大小 2。