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


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()和家庭的返回值。

在这种情况下,

您可以做几件事。

  1. 如果您在编译时知道要存储多少个字符,则可以将其设置为数组char foo[10]; 如果您知道总是要存储 10 个(或更少(字符。
  2. 如果您不确定在编译时需要保留多少个字符,您通常会使用 malloc 进行内存动态分配。现在,在使用malloc时,您可以指定所需的内存字节数,以便对于12个字符,您将执行malloc(12)malloc(12 * sizeof(char))。使用 malloc 时,您需要在使用完内存后手动free内存,因此能够请求任意(在限制范围内(内存大小的好处是以使内存管理更加困难为代价的。

作为旁注:您通常不希望强制转换 malloc 的返回值,因为它可以隐藏某些类型的错误和void *,无论如何,malloc返回都可以隐式转换为任何指针类型。

相关内容

  • 没有找到相关文章

最新更新