我有一个程序,将名称作为输入,如果输入少于允许的大小,它将保存在Pointer中。
如果输入大于允许的大小,则realloc
函数将用于满足所需的内存。
此时程序仅分配6个字节,5个用于名称MICHI
,1个用于'\ 0'。
如果用户键入MICHAEL
,则程序将为该指针分配足够的内存,以将MICHAEL
装入该指针。
这是程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person{
char *name;
}pers;
void addMem(void){
unsigned int length = 6;
size_t newLength = 0;
unsigned int newSize = 0;
unsigned int i =0;
char *name;
int c;
name = malloc(lenght);
if(name == NULL){
exit(1);
}
newSize = length;
printf("Enter your name:> ");
while ((c = getchar()) != '\n' && c!=EOF){
name[i++]=(char)c;
if(i == newSize){
newSize = i+length;
name = realloc(name, newSize);
}
}
name[i] = '\0';
newLength = strlen(name)+1;
pers.name = malloc(newLength);
memcpy(pers.name, name, newLength);
free(name);
name = NULL;
}
int main(void){
addMem();
printf("Your name is:> %s\n",pers.name);
free(pers.name);
pers.name = NULL;
return 0;
}
该程序运行良好,但是我需要以某种方式使realloc()仅提供最大的内存大小,因为这时它将重新分配,直到用户按下ENTER键为止。
这意味着我对Michi有6个字节(对于'\ 0'为5 + 1),最大大小应为8(对于Michael为7,对于'\ 0'为1)。
我怎样才能做到这一点?
编辑:
我希望你现在明白了。
我的程序仅接受5个字母的名称。
在某个时候,我决定may程序应该接受最多10个字母的名称。
我已经为5(michi)分配了内存。
如果键入Michael,我们有7个字母,因此程序应为Michael分配另外两个字母。
但是,如果我键入Schwarzernegger,那么这个名称太长了,我不接受它,因此我需要使我的程序仅为michael分配内存。
最佳答案
可以使用Enzo作为7个字母后停止的答案。
while ((c = getchar()) != '\n' && c != EOF) {
name[i++] = (char) c;
if (i >= length) {
if(i+1<=7)
name = realloc(name, i + 1);
else
{
//generate error message
}
}
}
关于c - 如何使用realloc重新分配另一个大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32638443/