哪个指针值是malloc调用的最大值

时间:2017-03-28 23:48:06

标签: c malloc

关于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);

2 个答案:

答案 0 :(得分:7)

你的问题的措辞有点过时了。你的意思是"我可以用于分配的内存块的最大索引是什么"。答案与数组相同。

  • 如果您正在读取或写入内存,则可以安全地使用(和包括)0之间的索引和小于块大小的索引(在您的情况下,这意味着索引19)。全部,这意味着您可以访问您要求的20个值。

  • 如果您只是获取指针以与同一块内的其他指针进行比较(并且您不会读取或写入),您可以另外获取指针-past-the-end(在你的情况下,这意味着索引20)。

用例子澄清这些事情:

  1. 是的,buffer[19] = 'a';是您可以在读取或写入容量中访问的最后一个值。不要忘记,如果你想在这个内存中存储一​​个字符串,并把它交给期望以空字符结尾的字符串的函数,这个插槽就是你把这个值放到'\0'的最后一次机会。

  2. 您可以通过以下方式访问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