1

如果我有 *p=malloc(1000),我想将内存 p 分成 200 和 300 的块,并获取块的地址并使用它。有什么简单的方法可以做到这一点吗?

4

2 回答 2

5

你有什么理由不做...

char* firstblock = malloc(200); char* secondblock = malloc(300); char* thirdblock = malloc(500);

如果你想采取你现在的方法,你可以这样做

char* wholething = malloc(1000); char* firstblock = wholething; char* secondblock = wholething + 200; char* thirdblock = wholething + (200 + 300);

但这对我来说没有多大意义。

我建议使用单独的块的第一个原因是因为你可以在完成后释放一个块。如果您无论如何要同时释放所有它们,那么确实可以在更少的函数调用方面略微提高性能,但这种好处可以忽略不计。第二个原因是您的系统可能更喜欢使用几个小块而不是一个大块,因为一个大块也不适合页面。尽管可以说相反,因为必须跟踪的块更少。尽管如此,在大多数情况下,性能优势或影响是如此微不足道,以至于您采用哪种方法实际上并不重要。所以第三个原因,可读性,就是我说使用单个块的原因。


请记住,偏移量可能需要也可能不需要乘以大小。

在这种情况下,是的...

char* wholething = malloc(1000 * sizeof(int)); int* firstblock = wholething; int* secondblock = wholething + 200; int* thirdblock = wholething + (200 + 300);

但在这种情况下,不...

int* wholething = malloc(1000 * sizeof(int)); int* firstblock = wholething; int* secondblock = wholething + 200; int* thirdblock = wholething + (200 + 300);

于 2014-03-30T15:58:09.710 回答
1

malloc一定会给你一个连续的块。您可以像遍历数组一样遍历块。划分成块只是索引到正确的位置。

char *p;
p = malloc(sizeof(char)*10+sizeof(int)*20);
char *x = p;
int *y = p+10;

现在x[0]tox[9]可以用于chars 并且y[0]toy[19]可以用于ints

这是一种非常愚蠢的方式。更好的方法是简单地使用单独的块。

于 2014-03-30T15:59:18.730 回答