【发布时间】:2020-10-03 18:50:05
【问题描述】:
我需要让用户输入他的名字并将其存储在一个数组char 中,这个数组的大小是动态定位的,取决于他输入的用户名。
这是我的代码:
#include <stdio.h>
void main()
{
static int size = 5 ;
printf("please Enter Your First Name..\n");
char* p = (char*)malloc(size*sizeof(char));
for(int i = 0 ; i <= sizeof(p) ; i++)
{
if(sizeof(p)+1 == size )
{
p = (char*)realloc(p,2*size*sizeof(char));
size = sizeof(p);
}
else
{
scanf("%c",&p[i]);
}
}
for(int i = 0 ; i <=size ; i++)
{
printf("%s",*(p+i));
}
free(p);
}
我给数组的第一个大小为5char,那么如果用户名长度大于这个大小,它在堆中重新分配大小的两倍,
我创建了一个条件 if(sizeof(p)+1 == size ) 因为 sizeof(p) = 4 ,所以我需要 5 = 5 所以我输入了 sizeof(p)+1。
但我的代码不起作用。为什么?
【问题讨论】:
-
我会通过分配一个足够大的缓冲区来做到这一点,然后通过重新分配缩小到大小。为每个角色重新定位是非常低效的。如果您必须使用这种方法,IMO 最好以 8 个字节的块工作(换句话说,当您用完空间时分配 8 个字节)。内存分配的粒度不太可能比这更好,因此您不会浪费内存。
-
@WeatherVane,我想创建一个缓冲区,但我认为它会是一样的,因为我给了数组的初始大小
-
sizeof(p)是干什么用的?那是缓冲区 pointer 的大小而不是缓冲区的大小。您无法获得内存分配的大小,除非使用您自己的变量进行跟踪。您需要两个变量,一个用于缓冲区大小,一个用于您已使用的数量。 -
@WeatherVane 指针大小,
-
好吧,
sizeof(p)+1将始终给出相同的值,无论您进行多少重新分配。
标签: arrays c pointers heap-memory