我应该将指针更改为数组吗?

时间:2016-01-11 20:10:17

标签: c malloc buffer dynamic-memory-allocation

for (int a=0; a<10; ++a) {
    printf ("%d", a);
}

char *foo;
foo = (char*)malloc(a); 

我想在char变量中存储多个foo值。

  

我应该将它更改为数组吗,因为缓冲区只分配1 char个长度?
   1是可以存储在此缓冲区中的最长长度吗?

3 个答案:

答案 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)

在这种情况下你可以做几件事。

  1. 如果您在编译时知道要存储多少个字符,可以将其设为数组char foo[10];如果您知道要存储的字符总数为10(或更少)。
  2. 如果您不确定在编译时需要保留多少个字符,您通常会使用malloc动态分配内存。现在,在使用malloc时,您可以指定所需的内存字节数,因此对于12个字符,您可以malloc(12)malloc(12 * sizeof(char))。当使用malloc时,你需要在使用它时手动free内存,因此能够要求任意(在极限范围内)内存大小的好处是以增加内存管理为代价的。
  3. 作为旁注:您通常不希望转换malloc的返回值,因为它可以隐藏某些类型的错误和void *malloc返回可以隐式转换无论如何,任何指针类型。