realloc()无效的旧大小

use*_*694 6 c realloc dynamic-memory-allocation

我正在从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;
}
Run Code Online (Sandbox Code Playgroud)

当我在一行中输入超过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]
Run Code Online (Sandbox Code Playgroud)

我还检查了realloc无效的旧大小,但无法遵循将指针传递给指向修改数组的函数的指针的逻辑.

dar*_*rix 9

realloccall将通过指向存储区域的指针重新分配内存,即指向heap 调用的动态分配的内存结果malloc.

在你的情况下,问题是你正在分配内存stack而不是动态malloc分配内存分配的调用heap.并且,传递的指针automatic字符数组line_getline其使用它调用realloc.所以,你得到了错误.

尝试动态分配字符数组line:

char* line  = (char *) malloc(MAXLINE); 
char* longest = ( char *) malloc(MAXLINE);
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

你得到的invalid old size,当你的代码写道,内存错误malloc/realloc分配的“看家信息”。这是他们存储“旧”分配大小的地方。这也发生时您传递指针realloc尚未正确初始化,即它既不是NULL以前从返回的,也不是一个指针malloc/ calloc/ realloc

在您的情况下,传递给的指针realloc实际上是在自动内存中分配的数组 - 即它不是有效的指针。要修正,改变的声明linelongest如下:

char *line = malloc(MAXLINE), *longest = malloc(MAXLINE);
Run Code Online (Sandbox Code Playgroud)

为避免内存泄漏,请确保在程序结束时调用free(line)free(longest)