我正在做 K&R C 编程书中的一个练习。该程序用于从用户输入的一组行中找到最长的行,然后打印它。
这是我写的(部分内容直接摘自书中):-
#include <stdio.h>
#include <stdlib.h>
int MAXLINE = 10;
int INCREMENT = 10;
void copy(char longest[], char line[]){
int i=0;
while((longest[i] = line[i]) != '\0'){
++i;
}
}
int _getline(char s[]){
int i,c;
for(i=0; ((c=getchar())!=EOF && c!='\n'); i++){
if(i == MAXLINE - 1){
s = (char*)realloc(s,MAXLINE + INCREMENT);
if(s == NULL){
printf("%s","Unable to allocate memory");
// goto ADDNULL;
exit(1);
}
MAXLINE = MAXLINE + INCREMENT;
}
s[i] = c;
}
if(c == '\n'){
s[i] = c;
++i;
}
ADDNULL:
s[i]= '\0';
return i;
}
int main(){
int max=0, len;
char line[MAXLINE], longest[MAXLINE];
while((len = _getline(line)) > 0){
printf("%d", MAXLINE);
if(len > max){
max = len;
copy(longest, line);
}
}
if(max>0){
printf("%s",longest);
}
return 0;
}
当我一行输入超过10个字符时,程序崩溃并显示:-
*** Error in `./a.out': realloc(): invalid old size: 0x00007fff26502ed0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3d6a07bbe7]
/lib64/libc.so.6[0x3d6a07f177]
/lib64/libc.so.6(realloc+0xd2)[0x3d6a0805a2]
./a.out[0x400697]
./a.out[0x40083c]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x3d6a021b45]
./a.out[0x400549]
我也检查过重新分配无效的旧大小 https://stackoverflow.com/questions/11406311/realloc-invalid-old-size但无法遵循将指针传递给修改数组的函数的指针的逻辑。
realloc
调用将通过获取指向存储区域的指针来重新分配内存heap
即调用的动态分配的内存结果malloc
.
在你的情况下,问题是你正在分配内存stack
而不是通过调用动态地malloc
这导致内存分配heap
。并且,传递的指针automatic
字符数组line
to _getline
它用它来调用realloc
。所以,你得到了错误。
尝试动态分配字符数组line
:
char* line = (char *) malloc(MAXLINE);
char* longest = ( char *) malloc(MAXLINE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)