- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,下面的代码读取标准输入并将其放入标准输出,但相反。我为此使用了一个静态数组,因为我知道 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/
如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果没有,就会发生泄漏。
OS: Linux CC: GCC 4.8.2 目标:改变 char* 的大小 -> 变小 问题:更改后的大小相同... 行是带有数据的字符串... 代码片段: char * tmp = NUL
在一个函数中我使用了 malloc : void name1(struct stos* s) { s = malloc (4 * sizeof (int)); } 一切正常。但是后来我用了rea
我知道有一个 realloc允许我调整内存块大小的函数(它与一个免费函数配对)。但是,我正在尝试对一些成员指针使用 new 而不是 realloc 分配内存的 c++ 类执行相同的操作。在 C++ 中
我正在尝试在 C 中创建一个动态整数数组,它应该在填满后自动将其大小加倍。 要扩展数组的大小,我想使用 realloc 函数。不幸的是,指向我的 DynamicArray 和 GCC 崩溃的数据的指针
这是我被教导使用的方式 realloc() : int *a = malloc(10); a = realloc(a, 100); // Why do we do "a = .... ?" if(a
我尝试在每个循环中使用 realloc(),因此我只为 C 中的 int 数组使用必要的内存,但输出值已更改。尽管如此,在我的代码中使用 Valgrind 时,我得到了正确的值。 我在做 Advent
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我想知道如果我尝试 realloc() 一个已递增的指针会发生什么。
我知道可以在内核中使用 malloc 在 GPU 的全局内存上分配内存。是否也可以使用realloc? 最佳答案 您可以为您的数据类型编写自己的 realloc 设备函数。 只需为新数组分配新空间,将
我在对数组使用 malloc/realloc 命令时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来为其添加一个值,但是当我这样做时,0 索引的值不
背景: 我使用 calloc() 创建了一个数组,一切都运行良好。然后我使用 realloc() 使数组更大。它似乎只是创建一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用运行时错误。 我的
假设我已经使用 malloc() 分配了内存,如果我在我的代码中这样做: char *newline = realloc ( oldline , newsize ); // Assuming oldl
我正在尝试在下面的程序中使用 realloc 重新分配内存,并在我使用 malloc(i = (int*)malloc(5 * sizeof(int))) 使用react的 realloc 初始内存之
为什么下面的代码输出两次 4,而不是 8 和 20?谢谢 int size = 0; int *pointer; pointer = malloc(2 * sizeof(int)); size = s
我正在尝试将一堆 WCHAR 添加到缓冲区。这个函数就是将它添加到我的缓冲区中的原因.. DWORD add_to_buffer(BYTE *databuffer, WCHAR *path, WCHA
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误: int ** zm; zm = (int**)calloc(1, sizeof(int*)); *zm = (in
我正在尝试用 C 语言编写代码,但遇到了 realloc 的问题。该代码在某个时间点工作正常,但在另一时间重新分配期间因堆损坏错误而崩溃。我已将填充数据的结构和函数粘贴到其中。谁能告诉我我是否在这里做
realloc 会改变它的第一个参数吗? 改变第一个参数是否取决于实现? 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const。 ISO C 标准,第 7.20.
我在 realloc 中遇到此错误,该错误仅发生在我学校的实验室计算机上,而不发生在我的计算机上。 在此程序中,我将行号存储在 File_Node 结构中。 File_Node 是一个链表的一部分,每
来自 man realloc:realloc() 函数返回一个指向新分配的内存的指针,该指针适合任何类型的变量,可能与 ptr 不同,如果请求失败,则返回 NULL . 因此在此代码片段中: ptr
我是一名优秀的程序员,十分优秀!