【发布时间】:2014-08-26 02:41:08
【问题描述】:
我正在从 KandR 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]
我还检查了realloc invalid old size,但无法遵循将指针传递给指向修改数组的函数的指针的逻辑。
【问题讨论】:
-
程序中的其他错误(使用括号确保计算和其他地方的含义)程序正在将 'int' 大小值写入 's' 数组,但仅分配 char 大小增量。跨度>
-
函数名'_getline'会与C库函数名冲突。而是使用类似“myGetLine”的东西
-
传递给 _getline 的参数不是指向 malloc 区域的指针,而是堆栈上区域的第一个地址。因此,尝试重新分配()该指针是错误的。建议获取 _getline 参数的初始指针为“line = (MAXSIZE*sizeof(int));”
-
执行realloc时,使用第二个参数((MAXLINE + INCREMENT)*sizeof(int))
标签: c dynamic-memory-allocation realloc