【发布时间】:2013-12-18 06:49:47
【问题描述】:
我有一个任务,我必须接受用户的输入。我不能使用链表,只能使用数组,所以我的计划是:
分配一些内存。
-
如果我们需要重新分配,意味着我达到了分配的单元格数:
尝试重新分配。如果成功,那就太好了。
如果我们不能重新分配,那么打印输入、释放内存和重新分配。
我无法真正决定告诉我如何到达分配的内存末尾的命令,这就是我需要你帮助的原因。我写道:
if (i==(MAX_CHARS_INPUT-1))
但我不确定。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_CHARS_INPUT 200
#define D_SIZE 2
void printWithMalloc(){
int charSize=1;
int *ptr=malloc(MAX_CHARS_INPUT*sizeof(charSize));
int i=0, j=0, c;
printf("please enter a string\n");
while ((c=getchar())!=EOF && c!='\n')
{
ptr[i++]=c;
if (i==(MAX_CHARS_INPUT-1)) /*if we need to realloc*/
{
int *temp=realloc(ptr,D_SIZE*MAX_CHARS_INPUT*sizeof(charSize));
if (temp==NULL) /*realloc failed*/
{
printf("you wrote:\n");
while(j<=i)
putchar(ptr[j++]);
free(ptr);
ptr=(int*)malloc(MAX_CHARS_INPUT*sizeof(charSize));
}
else
ptr=temp;
}
}
}
int main(){
printWithMalloc();
return 0;
}
谢谢!
【问题讨论】:
-
sizeof(charSize)会给你一个 int 的大小,因为 harSize 是一个 int。相反,只需执行sizeof(char) -
更好的是,完全省略它,因为
sizeof(char)的定义是 1。 -
您可能需要重新考虑使用额外的 2 个字节进行 realloc,因为它不是很有效,如果您的环境不是嵌入式环境(每个字节都很重要),只需添加一个 100 字节的块,如果空间不够,它会减少重新分配的数量。有一个变量来跟踪缓冲区大小,当你重新分配时增加它。
-
ptr是ints 的缓冲区,而不是chars。sizeof(charSize)可能看起来很困惑,但它(也许是无意的)是正确的。请改用sizeof *ptr,因为这将始终有效,尤其是如果您更改了ptr的类型。 -
@Kninnug,charSize 有意将每个单元格初始化为 1 位,即使它是 int。也许我应该更改变量的名称?谢谢大家的回答。
标签: c memory-management malloc free realloc