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