for (int a=0; a<10; ++a) {
printf ("%d", a);
}
char *foo;
foo = (char*)malloc(a);
我想foo
变量中存储多个char
值。
我应该将其更改为数组,因为缓冲区只分配 1
char
长度?
1 是此缓冲区中可以存储的最长长度吗?
好吧,foo现在指向一些a
字节的可用地址,因为这就是malloc()
的工作方式。无论其类型是 char *
,void *
或其他任何东西,您只能使用a
字节。
在这里,您将a
递增到 10。这意味着您可以存储 10 个字节,即 10 char
秒(因为在 C 的上下文中,1 个字符 = 1 个字节(,从foo
指向的地址开始。使用指针或数组是严格等效的。
由于缓冲区只分配 1 个字符的长度...
不,这里的情况并非如此。
引自C11
标准,第 §7.22.3.4 章,malloc
函数
void *malloc(size_t size);
malloc
函数为大小由size
和 其价值是不确定的。
所以,在
foo = malloc(a); //yes, the cast is not required
考虑到malloc()
成功,将分配大小与 a
值相同的内存。
简而言之,如果我写一个像这样的片段
int * p = malloc(10 * sizeof*p);
然后,我也可以写
for (int i = 0; i < 10, i++)
p[i] = i;
因为,我已经分配了 10 int
秒所需的内存。
也就是说,请参阅此讨论,了解为什么不在C
中转换malloc()
和家庭的返回值。
您可以做几件事。
- 如果您在编译时知道要存储多少个字符,则可以将其设置为数组
char foo[10];
如果您知道总是要存储 10 个(或更少(字符。 - 如果您不确定在编译时需要保留多少个字符,您通常会使用
malloc
进行内存动态分配。现在,在使用malloc时,您可以指定所需的内存字节数,以便对于12个字符,您将执行malloc(12)
或malloc(12 * sizeof(char))
。使用 malloc 时,您需要在使用完内存后手动free
内存,因此能够请求任意(在限制范围内(内存大小的好处是以使内存管理更加困难为代价的。
作为旁注:您通常不希望强制转换 malloc
的返回值,因为它可以隐藏某些类型的错误和void *
,无论如何,malloc
返回都可以隐式转换为任何指针类型。