gcc 4.5.1 c89
Run Code Online (Sandbox Code Playgroud)
我已经编写了这个源代码,以便我更好地理解malloc和calloc.
我理解,但只是有几个问题.
dev = malloc(number * sizeof *devices);
Run Code Online (Sandbox Code Playgroud)
等于这个calloc.我并不担心清理内存.
dev = calloc(number, sizeof *devices);
Run Code Online (Sandbox Code Playgroud)
与在while循环中执行5次相比,这究竟是什么呢?
dev = malloc(sizeof *devices);
Run Code Online (Sandbox Code Playgroud)
我想第一个和第二个是创建一个指向5结构设备的指针.第三个是创建一个指向结构设备的指针?
我的程序说明了使用valgrind编译和运行的3种不同方法--leak-check = full.
非常感谢任何建议.
#include <stdio.h>
#include <stdlib.h>
struct Devices {
#define MAX_NAME_SIZE 80
size_t id;
char name[MAX_NAME_SIZE];
};
struct Devices* create_device(struct Devices *dev);
void destroy_device(struct Devices *dev);
int main(void)
{
size_t num_devices = 5;
size_t i = 0;
struct Devices *device = NULL;
struct Devices *dev_malloc = NULL;
struct Devices *dev_calloc = NULL;
for(i = 0; i < num_devices; i++) {
device = create_device(device);
/* Assign values */
device->id = i + 1;
sprintf(device->name, "Device%zu", device->id);
/* Print values */
printf("ID ----- [ %zu ]\n", device->id);
printf("Name --- [ %s ]\n", device->name);
/* Test free */
destroy_device(device);
}
printf("\n");
dev_malloc = malloc(num_devices * sizeof *dev_malloc);
for(i = 0; i < num_devices; i++) {
/* Assign values */
dev_malloc->id = i + 1;
sprintf(dev_malloc->name, "dev_malloc%zu", dev_malloc->id);
/* Print values */
printf("ID ----- [ %zu ]\n", dev_malloc->id);
printf("Name --- [ %s ]\n", dev_malloc->name);
}
/* Test free */
destroy_device(dev_malloc);
printf("\n");
dev_calloc = calloc(num_devices, sizeof *dev_calloc);
for(i = 0; i < num_devices; i++) {
/* Assign values */
dev_calloc->id = i + 1;
sprintf(dev_calloc->name, "dev_calloc%zu", dev_calloc->id);
/* Print values */
printf("ID ----- [ %zu ]\n", dev_calloc->id);
printf("Name --- [ %s ]\n", dev_calloc->name);
}
/* Test free */
destroy_device(dev_calloc);
return 0;
}
struct Devices* create_device(struct Devices *dev)
{
/* Not checking for memory error - just simple test */
return dev = malloc(sizeof *dev);
}
void destroy_device(struct Devices *dev)
{
if(dev != NULL) {
free(dev);
}
}
Run Code Online (Sandbox Code Playgroud)
calloc(a,b)malloc(a*b)除了算术溢出或类型问题的可能性以及calloc确保内存为零字节填充的事实外,它们是等效的.分配的内存可以用于a每个大小的元素数组b(反之亦然).另一方面,调用malloc(b) a时间将导致a单个对象的大小b可以独立释放,而不是在数组中(尽管您可以将它们的地址存储在指针数组中).
希望这可以帮助.