for (int a=0; a<10; ++a) {
printf ("%d", a);
}
char *foo;
foo = (char*)malloc(a);
我想在char
变量中存储多个foo
值。
我应该将它更改为数组吗,因为缓冲区只分配1
char
个长度?
1是可以存储在此缓冲区中的最长长度吗?
答案 0 :(得分:2)
好吧,foo现在指向a
字节的一些可用地址,因为这是malloc()
的工作原理。如果其类型为char *
,void *
或其他任何内容,则只能使用a
字节无关紧要。
这里,您将a
增加到10.这意味着您可以存储10个字节,即10 char
s(因为在C的上下文中,1个char = 1个字节),从foo
指向的地址。使用指针或数组是完全等效的。
答案 1 :(得分:1)
由于缓冲区仅分配1个字符长度...
不,这不是这种情况。
引用C11
标准,章节§7.22.3.4, malloc
函数
void *malloc(size_t size);
malloc
函数为大小由size
指定的对象分配空间 其价值是不确定的。
所以,在
的情况下foo = malloc(a); //yes, the cast is not required
考虑到a
成功,将会分配一个与malloc()
的值相同的内存。
简单地说,如果我写一个像
这样的片段 int * p = malloc(10 * sizeof*p);
然后,我也可以写
for (int i = 0; i < 10, i++)
p[i] = i;
因为,我已为10 int
s分配了所需的内存。
那就是please see this discussion on why not to cast the return value of malloc()
and family in C
.。
答案 2 :(得分:0)
在这种情况下你可以做几件事。
char foo[10];
如果您知道要存储的字符总数为10(或更少)。malloc
动态分配内存。现在,在使用malloc时,您可以指定所需的内存字节数,因此对于12个字符,您可以malloc(12)
或malloc(12 * sizeof(char))
。当使用malloc时,你需要在使用它时手动free
内存,因此能够要求任意(在极限范围内)内存大小的好处是以增加内存管理为代价的。作为旁注:您通常不希望转换malloc
的返回值,因为它可以隐藏某些类型的错误和void *
,malloc
返回可以隐式转换无论如何,任何指针类型。