c - 为什么总是显示错误:pointer being realloc'd was not allocated

标签 c memory-management fgets c-strings realloc

我试图从文件中读取并将每行的指针放入双指针“堆栈”,但总是无法重新分配它。也许我应该使用三重指针???

int i = 1;
char * line = malloc(BUFSIZ);
char ** stack;
stack = (char ** ) malloc(sizeof(char * ));

while (fgets(line, BUFSIZ, file) != NULL) {
    stack = & line;
    printf("//%s", line);
    printf("??%s", * stack);
    i++;
    stack = (char ** ) realloc(stack, sizeof(char * ) * i);
}

最佳答案

对于初学者来说,代码存在内存泄漏。首先分配了一 block 内存

stack = (char ** ) malloc(sizeof(char * ));

然后指针stack被重新分配为指针line的地址。

while (fgets(line, BUFSIZ, file) != NULL) {

stack = & line;
//…

本声明

stack = (char ** ) realloc(stack, sizeof(char * ) * i);

导致未定义的行为,因为语句后面的指针堆栈

stack = & line;

不指向动态分配的内存。它指向一个局部变量line

看来您正在尝试做的是下面的演示程序中所示的内容。只是使用标准输入流 stdin 来代替文件。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int main(void) 
{
    char *line = malloc( BUFSIZ );
    char **stack = NULL;
    size_t n = 0;

    while ( fgets( line,BUFSIZ, stdin ) != NULL )
    {
        line[strcspn( line, "\n" )] = '\0';

        char **tmp = realloc( stack, ( n + 1 )* sizeof( char * ) );

        if ( tmp != NULL )
        {
            stack = tmp;
            ++n;

            stack[n-1] = malloc( BUFSIZ );

            if ( stack[n-1] != NULL ) strcpy( stack[n-1], line );
        }
    }

    for ( size_t i = 0; i < n; i++ )
    {
        if ( stack[i] != NULL ) puts( stack[i] );
    }

    for ( size_t i = 0; i < n; i++ )
    {
        free( stack[i] );
    }
    free( stack );

    free( line );

    return 0;
}

如果输入两个字符串

Hello
World

那么输出将是

Hello
World

关于c - 为什么总是显示错误:pointer being realloc'd was not allocated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59642289/

相关文章:

c - UPC 中指向共享数组的私有(private)指针数组

c - GCC 编译 (ld) 问题的最后一步

c - VkApplicationInfo 有什么意义?

C 自由函数(不使用 malloc)

php - 带有空文件的 file_get_contents 无法正常工作 PHP

c - 如何在c中的unsigned char中以字节为单位移动

swift - swift中保留计数和引用计数的区别

c - 尝试将唯一的单词读入文件,但内存分配出现问题

c - fgets() 在多次执行后崩溃

c - 获取 N 个字符串的输入时出现 fgets()/gets() 问题。在初始位置不接受输入