无类型指针malloc

void*malloc(int size);

可以申请一段长度为size字节的空间,并返回空间的首地址。
分配一个Size大小的内存空间,如果分配成功则返回地址空间的首地址,如果分配失败则返回NULL。

虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。

对于一个指向一块内存的指针如果用比如sizeof(p)显示大小(int * p=new
int[10]),也只是显示4,代表首地址大小,不能显示正块内存的大小,而且根本没有意义

#include <stdio.h>
#include <stdlib.h>
int main()
{	int num;
	int i;
    int choice;
    printf("请输入元素个数:\n");
    scanf("%d",&num);
    if(num>6)
  { printf("我们没有这么多姑娘,你没礼貌,相亲单方面终止!!!\n");
    
    system("pause");
    exit(-1);
   }
	int *palace=(int*)malloc(num*sizeof(int));
		if(palace==NULL)
        printf("开辟空间失败,请知晓!!!\n");
        
     
    for(i=1;i<=num;i++)
{
	printf("请输入你们家老%d的年龄:\n",i);
    scanf("%d",palace);
    palace++;


   
}
	  palace=palace-num;
		for(i=0;i<num;i++)
   {
		printf("请确认你们家老%d的年龄:%d\n",i+1,palace[i]);//*palace//
   
				/*palace++;*/
   }
   
   printf("请选择你中意的人:\n");
   scanf("%d",&choice);
   switch(choice){
	case 1:
			printf("恭喜你走上不轨之路,约会(提货)时间在8月1日\n");
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;
    case 2:
			printf("恭喜你相亲成功,你选择的相亲对象为老%d,约会(提货)时间在8月2日\n",choice);
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;
    case 3:
			printf("恭喜你相亲成功,你选择的相亲对象为老%d,约会(提货)时间在8月3日\n",choice);
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;
    case 4:
			printf("恭喜你相亲成功,你选择的相亲对象为老%d,约会(提货)时间在8月4日\n",choice); 
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;  
    case 5:
			printf("恭喜你相亲成功,你选择的相亲对象为老%d,约会(提货)时间在8月5日\n",choice); 
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;
    case 6:
			printf("恭喜你相亲成功,你选择的相亲对象为老%d,约会(提货)时间在8月6日\n",choice); 
            printf("她的年龄为%d岁\n",palace[choice-1]);
            break;        
   default:
			printf("你没有认真做出选择,所有姑娘都瞧不起你,相亲失败!!!\n");
			break;
   }
	free(palace);
    
    
    palace=NULL;
	
    system("pause");
    
	return 0;
}

在 C 语言中,程序中 malloc 等内存分配函数的使用次数一定要和 free 相等,并一一配对使用。绝对要避免“malloc 两次
free 一次”或者“malloc 一次 free
两次”等情况。这就像我们的婚姻制度,必须是“一夫一妻制”,不能够“多夫一妻”或者“一夫多妻”,这些都是不合法的

在 free 之后必须为指针赋一个新值 在使用指针进行动态内存分配操作时,在指针 p 被 free
释放之后,指针变量本身并没有被删除。如果这时候没有将指针 p 置为 NULL,会让人误以为 p 是个合法的指针而在以后的程序中错误使用它。

free§ 完之后,一定要将指针变量 p 置为 NULL

在C语言中,指针和`malloc`函数是紧密相关的,`malloc`函数用于动态分配内存,而指针则用于操作这些动态分配的内存。 ### 指针与`malloc`函数的使用方法 `malloc`函数的原型位于`<stdlib.h>`头文件中,原型为`void *malloc(size_t size)`,它的作用是在内存的堆区分配一块指定大小的连续内存空间,并返回一个指向该内存块起始地址的`void*`类型指针。在使用时,通常需要将其返回值强制转换为所需的指针类型。例如,若要分配一个`int`类型的内存空间,代码如下: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p; p = (int*)malloc(sizeof(int)); if (p != NULL) { // 使用分配的内存 *p = 10; printf("Value: %d\n", *p); } free(p); // 释放内存 return 0; } ``` 在上述代码中,`(int*)malloc(sizeof(int))`分配了一个`int`类型大小的内存空间,并将其地址赋值给指针`p`。通过`*p`可以访问和修改这块内存中的值。最后使用`free(p)`释放了这块内存。 ### 注意事项 - **内存泄漏**:使用`malloc`分配的内存必须在再使用时使用`free`函数释放,否则会造成内存泄漏,即这部分内存无法再被程序或系统使用。 - **空指针检查**:`malloc`函数可能会因为内存足等原因返回`NULL`指针。因此,在使用返回的指针之前,需要检查其是否为`NULL`,以避免对空指针进行操作导致程序崩溃。 - **强制类型转换**:`malloc`函数返回的是`void*`类型指针,在赋值给其他类型指针时需要进行强制类型转换,确保指针类型匹配。 - **内存碎片**:频繁地分配和释放同大小的内存块可能会导致内存碎片问题。当空闲链被切成很多小内存片段时,可能无法满足大内存块的分配请求。此时,`malloc`函数会进行内存整理,将相邻的小空闲块合并成较大的内存块 [^4]。 ### 示例代码 以下是一个更复杂的示例,展示了如何使用`malloc`函数分配一个包含多个元素的数组: ```c #include <stdio.h> #include <stdlib.h> int main() { int n = 5; int *arr; arr = (int*)malloc(n * sizeof(int)); if (arr != NULL) { for (int i = 0; i < n; i++) { arr[i] = i * 2; } for (int i = 0; i < n; i++) { printf("arr[%d] = %d\n", i, arr[i]); } free(arr); } return 0; } ``` 在这个示例中,`(int*)malloc(n * sizeof(int))`分配了一个包含`n`个`int`类型元素的数组。通过指针`arr`可以像使用普通数组一样访问和修改这些元素。最后使用`free(arr)`释放了整个数组的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值