这两种方法都是正确的,选择最佳选项取决于分配块的生命周期;配对内存分配和释放操作很重要。如果该内存只在myfun1()/myfun2() 上下文中使用,我建议在那里分配和释放它。但是,如果它会持续存在并用于程序的其他部分,最好将内存分配和释放的位置非常明显,而不是让它成为某些其他操作的副作用。
另外,我建议始终使用sizeof(struct node) 和sizeof(int) 而不是sizeof(*head) 和sizeof(*arr)。它更清晰,并且可以防止其他人在您的原始代码中指出的那种错误。
在myfun1() 的上下文中,sizeof(head) 为您提供指向结构的指针的大小,而sizeof(*head) 为您提供结构本身的大小 ,在这种情况下,这就是您想要的。
同样,sizeof(arr) 为您提供指向 int 的指针的大小,sizeof(*arr) 为您提供单个 int 的大小。
对数组使用 sizeof 操作数还有一个警告:它的行为取决于声明数组的上下文以及它是在堆栈上还是在堆上分配的。
这里有一个小程序可以说明这一点。在声明数组的同一上下文中使用时,请特别注意sizeof(stackArray)。
#include <stdio.h>
#include <stdlib.h>
#define N 10
void aux(int *stackArray, int *heapArray) {
printf("\nIn a different context:\n");
printf("sizeof(*stackArray) == sizeof(int): %zu\n", sizeof(*stackArray));
printf("sizeof(*heapArray) == sizeof(int): %zu\n", sizeof(*heapArray));
printf("sizeof(stackArray) == sizeof(int *): %zu\n", sizeof(stackArray));
printf("sizeof(heapArray) == sizeof(int *): %zu\n", sizeof(heapArray));
}
int main() {
int stackArray[N];
int *heapArray = malloc(N * sizeof(int));
printf("In the context in which they were declared/allocated:\n");
printf("sizeof(*stackArray) == sizeof(int): %zu\n", sizeof(*stackArray));
printf("sizeof(*heapArray) == sizeof(int): %zu\n", sizeof(*heapArray));
printf("sizeof(stackArray) == N * sizeof(int): %zu\n", sizeof(stackArray));
printf("sizeof(heapArray) == sizeof(int *): %zu\n", sizeof(heapArray));
aux(stackArray, heapArray);
free(heapArray);
return 0;
}
该程序在我的机器上的输出是:
在声明/分配它们的上下文中:
sizeof(*stackArray) == sizeof(int): 4
sizeof(*heapArray) == sizeof(int): 4
sizeof(stackArray) == N * sizeof(int): 40
sizeof(heapArray) == sizeof(int *): 8
在不同的环境中:
sizeof(*stackArray) == sizeof(int): 4
sizeof(*heapArray) == sizeof(int): 4
sizeof(stackArray) == sizeof(int *): 8
sizeof(heapArray) == sizeof(int *): 8
简而言之,如果您始终将sizeof() 与您想要的类型而不是变量名一起使用,则您无需担心这些事情。