gpt4 book ai didi

使用 malloc 和 realloc 将静态数组更改为动态数组?

转载 作者:行者123 更新时间:2023-11-30 18:40:11 25 4
gpt4 key购买 nike

你好,下面的代码读取标准输入并将其放入标准输出,但相反。我为此使用了一个静态数组,因为我知道 input.txt 中有多少个字符。我的问题是如何使用 malloc 和 realloc 更改动态数组(指针)中的数组?我所有的尝试都失败了。

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



int main()
{
char ch;
int i,counter;
char array[50];

counter = 0;
i = 0;

while((ch=getchar()) != EOF)
{

array[i] = ch;
i++;
counter++;

}

for(i = (counter + 1); i >= 0; i--)
{
printf("%c",array[i]);
}

printf("\n");

return 0;
}

最佳答案

即使您知道您使用的输入永远不会超过 50 个字符,您也应该强制执行该限制。当程序以任意输入运行时,您最终将访问超出数组末尾的数据。

无论如何,这是你的程序核心,提取到一个函数中:

void rev1()
{
char array[50]; // Allocate 50 bytes on the stack
int i = 0;
char ch;

while (i < 50 && (ch = getchar()) != EOF) array[i++] = ch;
while (i--) putchar(array[i]);
printf("\n");

// Do nothing - array goes out of scope
}

如果您只想在堆上使用相同的固定长度缓冲区,则代码非常相似。您应该定义一个指向 char 而不是数组的指针,然后调用 malloc 以获得所需的内存。使用完该内存后,必须使用 free 释放它。

这是使用堆上内存的第二个版本:

void rev2()
{
char *array;
int i = 0;
char ch;

array = malloc(50 * sizeof(*array)); // Allocate on the heap
if (array == NULL) exit(1); // Check for failure

while (i < 50 && (ch = getchar()) != EOF) array[i++] = ch;
while (i--) putchar(array[i]);
printf("\n");

free(array); // Explicitly release data after use
}

注意事项:

    在这种情况下,
  • sizeof(*array)sizeof(char),它始终为 1,因此经常被省略。但是 p = malloc(count * sizeof(*p)) 是一种非常有用的分配模式,用于分配 count 元素数组,如果更改类型,该数组仍然有效。所指的事物。

  • 堆上的内存分配可能会失败;然后malloc将返回NULL。您必须照顾此类情况。简单的策略是只打印一条错误消息并中止程序。根据您需要内存的用途,您可以选择其他失败策略。

  • 请注意,该函数的核心、循环与第一个版本中的完全相同。

  • 您还必须强制执行 50 个字符的限制。该数组位于堆上,但它不会增长。

  • 使用后释放内存。如果你不这样做,你就会“泄漏内存”,即你会阻塞内存块。这里,数组——保存数组的指针变量,而不是数组本身——是一个超出范围的局部变量。忘记释放此处的内存将意味着您丢失其地址并且无法再次访问它。

  • 变量array指向内存的开头。该变量必须传递给free。不要更改此变量,例如增加它,否则你将失去内存的“ key ”。

稍微复杂一点的版本会根据需要重新分配内存。如果数组增长,您可以使用 realloc 而不是 malloc。即使内存不同,已分配的数据仍保留在原处:

void rev3()
{
char *array = NULL; // Initially unallocated NULL array
size_t size = 0; // Allocated size, initially 0
int i = 0;
char ch;

while ((ch = getchar()) != EOF) {
if (i >= size) { // Check current bounds
size += 50; // Increase memory
array = realloc(array, // Reallocate
size * sizeof(*array));
if (array == NULL) exit(1);
}
array[i++] = ch;
}

while (i--) putchar(array[i]);
printf("\n");

free(array); // Explicitly release data after use
}

注释:

  • realloc(NULL, size) 的行为类似于 malloc(size)。因此,您可以通过从 NULL 指针开始轻松实现重新分配方案。

  • 虽然内核在内部跟踪分配的大小,但您无法知道它,因此您必须自己跟踪此信息,在本例中使用 size

  • 同样,您必须确保分配成功。我在上面使用了快速而肮脏(和静默)的程序终止,但您可以选择其他策略。

  • 在这种情况下,核心循环的参与程度会更高一些。在追加到内存之前,必须检查是否应该增加它。填充内存后,访问(在分配的范围内)如常。

关于使用 malloc 和 realloc 将静态数组更改为动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981653/

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