指针和malloc。。。。此代码段中有错误 #包括 #包括 int main() { int*ptr=NULL; ptr=(int*)malloc(2*sizeof(int*);//动态分配内存 返回0; }//这种类型的分配有什么错误

指针和malloc。。。。此代码段中有错误 #包括 #包括 int main() { int*ptr=NULL; ptr=(int*)malloc(2*sizeof(int*);//动态分配内存 返回0; }//这种类型的分配有什么错误,c,C,问题在于sizeof(int*)并且应该是sizeof(int)) 动态分配要求您告诉它要分配的字节大小,因此在本例中,您应该使用sizeof(int)我猜您希望为2个int分配空间(而不是指向int的2个指针): 如果仔细阅读编译错误,您就会明白这一点 int *ptr = malloc(2*sizeof(int));//memory allocation dynamically 上面的代码是错误的。应该是: int *ptr = NULL; ptr = (int*)malloc(2*siz

问题在于
sizeof(int*)
并且应该是
sizeof(int))


动态分配要求您告诉它要分配的字节大小,因此在本例中,您应该使用
sizeof(int)

我猜您希望为2个int分配空间(而不是指向int的2个指针):


如果仔细阅读编译错误,您就会明白这一点

int *ptr = malloc(2*sizeof(int));//memory allocation dynamically
上面的代码是错误的。应该是:

int *ptr = NULL;
ptr = (int*)malloc(2*sizeof(int*)); //wrong
无需强制转换
malloc
的返回值<代码>无效*将安全浇铸。此外,如果需要修改ptr的数据类型,使用
sizeof(*ptr)
更易于维护

另外,当不再需要动态分配的内存时,请释放该内存,否则将导致内存泄漏

ptr = malloc(2*sizeof(*ptr));

你确实做错了什么事——你根本不知道那是什么吗?(除了转换malloc的结果外,我还使用gcc进行编译,并使用*ptr=34;即使代码缺少严格性,
sizeof(*ptr)
也不会比
sizeof(int)
更便于移植。与原始的
sizeof(int*)
相比,这些都是正确的方法。假设我将
int*ptr
更改为
long*ptr
,我不需要对分配进行任何更改。如果我使用的是
sizeof(int)
,则需要将其修改为
sizeof(long)
。是的,这是正确的,但与代码的可移植性无关。(=当前代码是否在其他环境中运行而无需修改)是的,portable是错误的词。我应该使用易维护性:)
ptr = malloc(2*sizeof(*ptr));
free(ptr);