gpt4 book ai didi

C:使用malloc和realloc将初始内存加倍

转载 作者:行者123 更新时间:2023-11-30 17:30:51 26 4
gpt4 key购买 nike

我仍在学习动态内存的工作原理,对于 malloc、realloc 业务还是个新手,需要真正的帮助。我的目标是读取包含某些段落的文件并将这些行动态存储在字符串数组中。可以存储的初始行数为 10,如果这还不够,我们需要将内存数量加倍,并打印一 strip 有行号的消息,其中我们将内存加倍。

int main(int argc, char* argv[])
{
char* lines;
int line = 0;

lines = malloc(10 * sizeof(char));
while(fgets(lines, sizeof(lines), stdin)
{
if(lines[strlen(lines)-1] != '\n')
{
lines = realloc(lines, 5);
line++;
printf("Reallocating to %d lines", line);
{
}
}

我完全陷入困境,需要任何我能找到的帮助。

最佳答案

使用您的代码,您一次只能存储一个段落。在循环中 lines 变量始终被覆盖。此外,看看realloc()原型(prototype):

void *realloc(void *ptr, size_t size);

以及手册页内容:

The realloc() function changes the size of the memory block pointed to by ptr to size bytes.

因此,您总是将 lines 变量的大小更改为 5。您并没有增加它的大小。
可能的方法之一:

  • 有一个缓冲区,用于存储由 fgets() 读取的行,
  • 有一个指向指针的动态数组;将 char**lines 视为 char*lines[SOME_SIZE]
  • 每次fgets()成功时,分配内存来存储缓冲区当前保存的行,然后将其分配给数组中的指针。
  • 如果达到行数限制,请将行数加倍并在数组上调用 realloc()


与 Alter Mann 相同,我使用 q 退出循环。
这是完整的代码:

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

int main(void)
{
char** lines = NULL;
int i;
int curr_row = 0;
int rows = 5;
int columns = 100;
char buf[100];
lines = (char**)malloc(rows*sizeof(char*));
while (fgets(buf, columns, stdin) != NULL) {
if (strcmp(buf, "q\n") == 0) {
break;
}
lines[curr_row] = malloc(strlen(buf)+1);
strcpy(lines[curr_row], buf);
curr_row++;
if (curr_row == rows) {
rows *= 2;
lines = (char**)realloc(lines, rows*sizeof(char*));
printf("reallocated lines to %d rows\n",rows);
}
}
printf("\nYOUR PARAGRAPH: \n");
for (i = 0; i < curr_row; i++) {
printf("%s",lines[i]);
free(lines[i]);
}
free(lines);

return 0;
}

永远记住free()分配的内存。

关于C:使用malloc和realloc将初始内存加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24905608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com