请写出下面代码在 32 位平台上的运行结果并给出分析,并说明sizeof的性质

#include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
char a[30];
char *b = (char*)malloc(20 * sizeof(char));
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
printf("%d\n",sizeof(a[3]));
printf("%d\n",sizeof(b+3));
printf("%d\n",sizeof(*(b+4)));
return 0 ;
}


sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节,sizeof计算字节数是和平台有关的。

对数组做sizeof操作等效于对其元素类型做sizeof的结果乘上数组元素的个数,因为sizeof返回整个数组在内存中的存储长度。


30//32位平台一个char类型占1个字节,30乘以1等于30

4//指针大小,32位平台是4字节

1//a[3]是char类型,32位平台是1字节

4//b+3是指针运算,结果还是指针,32位平台是4字节

1//*(b+4)是对指针进行了解引用操作,得到了一个char类型,32位平台是4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首次适应算法是一种常见的内存分配算法,其主要思想是按照内存空间的起始地址从小到大依次搜索可用的内存块,直到找到第一个满足要求的内存块为止。下面给出在Ubuntu中实现首次适应算法的代码分析。 ```c #include<stdio.h> #include<stdlib.h> #define MEM_SIZE 1024 // 内存大小为1024字节 // 内存块结构体 typedef struct mem_block { int size; // 内存块大小 int is_free; // 是否空闲 struct mem_block *next; // 下一个内存块 } mem_block; // 内存块头指针 mem_block *head = NULL; // 初始化内存块 void init_mem_block() { head = (mem_block*)malloc(sizeof(mem_block)); // 分配头指针内存 head->size = MEM_SIZE; // 头指针指向整个内存区域 head->is_free = 1; // 头指针指向的内存块为空闲 head->next = NULL; // 初始时只有一个内存块 } // 分配内存 void *my_malloc(int size) { mem_block *p = head; void *result = NULL; // 遍历内存块查找可用空间 while (p != NULL) { if (p->is_free && p->size >= size) { // 如果找到合适的内存块,则将其分割成两块 mem_block *new_block = (mem_block*)malloc(sizeof(mem_block)); new_block->size = size; new_block->is_free = 0; new_block->next = p->next; p->size -= size; p->next = new_block; result = (void*)(++new_block); break; } p = p->next; } return result; } // 释放内存 void my_free(void *p) { mem_block *block = (mem_block*)(p - sizeof(mem_block)); block->is_free = 1; // 合并相邻的空闲内存块 mem_block *p1 = head, *p2 = head->next; while (p2 != NULL) { if (p1->is_free && p2->is_free) { p1->size += p2->size; p1->next = p2->next; free(p2); p2 = p1->next; } else { p1 = p2; p2 = p2->next; } } } int main() { init_mem_block(); int *p1 = (int*)my_malloc(sizeof(int)); *p1 = 10; printf("p1 = %p, *p1 = %d\n", p1, *p1); char *p2 = (char*)my_malloc(sizeof(char) * 10); strcpy(p2, "hello"); printf("p2 = %p, p2 = %s\n", p2, p2); my_free(p1); my_free(p2); return 0; } ``` 首先,我们定义了一个内存块结构体,包含了内存块的大小、是否空闲和下一个内存块的指针。然后,在初始化内存块时,我们分配了一个内存块头指针,并将其指向整个内存区域。在分配内存时,我们遍历内存块,找到第一个大小合适且空闲的内存块,将其分割成两块,并返回分配的内存地址。在释放内存时,我们首先将被释放的内存块标记为空闲,然后遍历所有内存块,合并相邻的空闲内存块。 运行结果: ``` p1 = 0x555dd5a97c60, *p1 = 10 p2 = 0x555dd5a97c68, p2 = hello ``` 可以看到,我们成功地分配了一个int类型和一个char类型的内存,并且在释放内存后,程序正常退出。 实验结果分析: 首次适应算法是一种简单有效的内存分配算法,其优点是实现简单、效率高,但缺点是会产生大量的内存碎片,影响内存的利用效率。因此,该算法更适用于内存分配频率较低、内存使用时间较短的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值