【问题标题】:Why does this always show an error:pointer being realloc'd was not allocated为什么这总是显示错误:未分配重新分配的指针
【发布时间】:2020-01-08 08:50:10
【问题描述】:

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

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);
}

【问题讨论】:

  • 你怎么知道它失败了?
  • 你觉得这个:stack=&line; 对你(重新)分配的指针有什么影响?
  • @JJK ZH 提供的代码没有意义。它有内存泄漏和这个语句 stack=&line;不分配内存。
  • @Vlad 我认为(但显然不知道)OP正试图使用​​它将数据从line复制到“在堆栈的某个地方?”
  • 您确实需要阅读有关分配和指针的教程。我开始写一个答案,但是这段代码充满了缺陷。另外,Don't cast malloc

标签: c memory-management fgets c-strings realloc


【解决方案1】:

对于初学者来说,代码存在内存泄漏。一开始是分配内存的

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

【讨论】:

    【解决方案2】:

    您收到此错误消息是因为您将stack 设置为line 的地址。因此,stack 不再是一个已分配的块。

    您的代码中有一些错误。

    • 您应该将该行存储在堆栈中的索引i
    • 你应该为每一行分配一个新块
    • 您应该重新分配 i+1 行,以便为下一行(如果有)腾出空间

    以下是更正后的代码:

    int i = 0; // number of line pointers in the stack
    char *line = malloc(BUFSIZ);
    char **stack = malloc(sizeof(char*));
    while( fgets(line, BUFSIZ, file) != NULL) {
        stack[i] = line;
        printf("//%s", line);
        printf("??%s", stack[i]);
        i++;
        line = malloc(BUFSIZ); // allocate a new block for the next line
        stack = realloc(stack, sizeof(char*)*(i+1)); // make room for the next line
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多