第一件事,这是为一个大学班级。问题是运行malloc 1001次,大小为4,将每个返回的指针存储为char *,然后得到第一个指针和最后一个指针之间的差异,以计算所使用的总内存。指令还指出,这个数字将远远高于人们的预期。
到目前为止,这就是我所拥有的,但我不认为它能正常工作(即使是这样,如果有人能告诉我如何更有效地做到这一点,我也会很感激):
#include <stdio.h>
#include <stdlib.h>
int main()
{
// Init variables
int size = 4;
char *ptrs[1001];
// Allocate memory
for (int i = 0; i <= 1001; i++)
{
ptrs[i] = malloc(size);
}
// Get first and last address
int *first_ptr = (int*)&ptrs[0];
int *last_ptr = (int*)&ptrs[sizeof(ptrs) / sizeof(*ptrs) - 1];
int diff = (int)last_ptr - (int)first_ptr;
// Print first and last address
printf("First pointer's address: %d\n", first_ptr);
printf("Last pointer's address: %d\n", last_ptr);
printf("Memory used: %d\n", diff);
free(*ptrs);
return 0;
}到目前为止,第一个和最后一个地址总是很大的负值(这可能很好,我不确定),而且差别总是4000,即使我将大小更改为16或32。
任何帮助都将不胜感激。
发布于 2022-02-15 20:14:42
您的代码有错误:
下面的循环应该具有此条件:i< 1001而不是i <= 1001作为char *ptrs1001有1001元素(索引格式为0到1000),而不是1002。
// Allocate memory
for (int i = 0; i <= 1001; i++)
{
ptrs[i] = malloc(size);
}如果您想知道分配内存的地址与数组元素的地址之间的差异,那么只需使用数组的值:
int difference = (int)(ptrs[1000] - ptrs[0])在您的例子中,您正在计算数组中的地址之间的差异,它取决于数组元素的大小(指针的大小),而不是它的元素的内容。
// Get first and last address
int *first_ptr = (int*)&ptrs[0];
int *last_ptr = (int*)&ptrs[sizeof(ptrs) / sizeof(*ptrs) - 1];第一个和最后一个元素之间的差异并不保证是实际使用的内存大小。这取决于内存分配的工作方式。
https://stackoverflow.com/questions/71132660
复制相似问题