关于malloc的相当简单的问题。我可以在分配区域内设置的最大值是多少。例如:
char *buffer;
buffer = malloc(20);
buffer[19] = 'a'; //Is this the highest spot I can set?
buffer[20] = 'a'; //Or is this the highest spot I can set?
free(buffer);
答案 0 :(得分:7)
你的问题的措辞有点过时了。你的意思是"我可以用于分配的内存块的最大索引是什么"。答案与数组相同。
如果您正在读取或写入内存,则可以安全地使用(和包括)0之间的索引和小于块大小的索引(在您的情况下,这意味着索引19)。全部,这意味着您可以访问您要求的20个值。
如果您只是获取指针以与同一块内的其他指针进行比较(并且您不会读取或写入),您可以另外获取指针-past-the-end(在你的情况下,这意味着索引20)。
用例子澄清这些事情:
是的,buffer[19] = 'a';
是您可以在读取或写入容量中访问的最后一个值。不要忘记,如果你想在这个内存中存储一个字符串,并把它交给期望以空字符结尾的字符串的函数,这个插槽就是你把这个值放到'\0'
的最后一次机会。
您可以通过以下方式访问buffer[20]
:
char *p;
for( p = &buffer[0]; p != &buffer[20]; ++p )
{
putc( *p, stdout );
}
这很有用,因为我们倾向于迭代内存和存储大小。如果我们不得不在整个地方减去1,这将使我们的代码可读性降低。
哦,它给你一个巧妙的伎俩:
size_t buf_size = 20;
char *buffer = malloc(buf_size);
char *start = buffer;
char *end = buffer + buf_size;
size_t oops_i_forgot_the_size = end - start;
答案 1 :(得分:2)
malloc(x)
将分配x
个字节。
通过访问buffer[0]
您访问第一个字节,访问buffer[1]
即可访问第二个字段。
e.g
char * buffer = (char *) malloc(1);
buffer[0] = 0; // legal
buffer[1] = 0; // illegal