我正在阅读
的C代码 char * buf = malloc(sizeof (char *) * 16)
而不是
char buf[sizeof (char *) * 16]
有什么区别?好吧,我认为第一个表达式是不必要的,如果没有调用realloc()
,或者我错了思考?
答案 0 :(得分:5)
char buf[sizeof(char*)*16]
是自动分配的数组,通常是堆栈。只要buf在范围内,并且有足够的堆栈空间,它就是有效的。
malloc
从一些堆中分配内存。在此内存为free()
之前有效。通常,可用的堆更多。
答案 1 :(得分:1)
Yann的说明是正确的。
这似乎是一个指针数组。因为它分配的内存是char指针大小的16倍。指针大小可能因系统而异。有些指针是32位(4字节),其他指针是64位(8字节)。
char buf [sizeof(char *)* 16]不是一个指针数组,它是一个字符数组,其元素等于char指针的大小为16。
答案 2 :(得分:1)
第一个是dynamic array。表达式char * buf = malloc(sizeof (char *) * 16)
将元素存储在内存中(malloc
基本上用于内存分配)。使用它的优点是,您可以重新分配它,即在运行时调整它。但是,每次添加新元素时,可能必须分配新内存。这是一个例子:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main() {
int* array;
int n, i;
printf("Enter the number of elements: ");
scanf("%d", &n);
array = malloc(n*sizeof(int));
for (i=0; i<n; i++) {
printf("Enter number %d: ", i);
scanf("%d", &array[i]);
}
printf("\nThe Dynamic Array is: \n");
for (i=0; i<n; i++) {
printf("The value of %d is %d\n", i, array[i]);
}
printf("Size= %d\n", i);
getch();
return 0;
}
输出:
第二个表达式char buf[sizeof (char *) * 16]
只声明了一个无聊的自动数组。它的大小是静态的。没有动态调整大小,重新分配等。
注意:为malloc
之前的类型转换道歉。如果你做错了,那么对malloc的返回值进行类型转换会导致编译器没有错误。接下来可能是未定义的运行时错误和调试地狱。始终避免对malloc
的结果进行类型转换。谢谢@Lundin。 子>
答案 3 :(得分:0)
主要区别在于,如果这是代码在函数中,您仍然可以在返回后使用前者声明的指针。