7-2 实验10_7_动态分配内存_2 (100分)

7-2 实验10_7_动态分配内存_2 (100分)

已知正整数n、m,你要利用malloc函数动态开辟一个n行、m列的整型二维数组,然后读取nm个整数存入该数组中。再将这nm个整数全部改为其相反数的10倍,然后将其输出。最后你要利用free函数将该动态数组所占用的空间释放。

提示:malloc与free的使用,以下代码即建立了一个n行m列的整型二维动态数组,并释放:

int **a,n ,m;
scanf(%d%d”,&n,&m);
a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
for(i=0;i<n;i++)
a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
for(i=0;i<n;i++)
free(a[i]);
free(a);//释放动态内存。

输入格式:
输入为两行,第一行为两个用空格分隔的正整数n,m,第二行为nm个用空格分隔整数。测试用例保证所有整数可以用int存储,且为这nm个整数申请内存不会超出内存限制。

输出格式:
输出按矩阵格式输出,具体见样例。

输入样例:

3 4
1 2 3 4 5 6 7 8 9 10 11 12

输出样例:

-10 -20 -30 -40
-50 -60 -70 -80
-90 -100 -110 -120
#include<stdio.h>
#include <stdlib.h>

int main() {
    int **a, n, m;
    scanf("%d%d", &n, &m);
    a = (int **) malloc(sizeof(int *) * n);//建立长度为n的动态指针数组
    for (int i = 0; i < n; i++) {
        a[i] = (int *) malloc(sizeof(int) * m);//建立长度为m的一维整型数组
    }

    for (int i = 0; i <n ; i++) {
        for (int j = 0; j <m ; j++) {
            scanf("%d",&a[i][j]);
            a[i][j]=a[i][j]*(-10);
        }
    }
    for (int i = 0; i <n ; i++) {
        for (int j = 0; j <m ; j++) {
            if (j!=m-1){
                printf("%d ",a[i][j]);
            }else{
                printf("%d\n",a[i][j]);
            }
        }
    }
    for (int i = 0; i < n; i++)
        free(a[i]);
    free(a);//释放动态内存。
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个关于动态分区分配实验的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_MEM_SIZE 1024 // 内存大小 #define MIN_MEM_SIZE 4 // 最小内存块大小 // 内存块结构体 typedef struct _mem_block { int size; // 内存块大小 int is_free; // 是否空闲 struct _mem_block* next; // 下一个内存块的地址 } mem_block; mem_block* mem_start = NULL; // 内存起始地址 // 初始化内存 void init_mem() { mem_start = (mem_block*)malloc(MAX_MEM_SIZE); mem_start->size = MAX_MEM_SIZE - sizeof(mem_block); mem_start->is_free = 1; mem_start->next = NULL; } // 分配内存块 void* my_malloc(int size) { mem_block* p = mem_start; mem_block* prev = NULL; // 遍历内存块链表,查找符合大小并且空闲的内存块 while (p != NULL) { if (p->size >= size && p->is_free) { // 如果内存块大小大于等于需求大小,且空闲,则分配这个内存块 if (p->size - size >= MIN_MEM_SIZE + sizeof(mem_block)) { // 如果剩余内存大小足够分配一个新的内存块,则分裂出一个新的内存块出来 mem_block* new_block = (mem_block*)((char*)p + sizeof(mem_block) + size); new_block->size = p->size - sizeof(mem_block) - size; new_block->is_free = 1; new_block->next = p->next; p->next = new_block; p->size = size; } p->is_free = 0; return (void*)((char*)p + sizeof(mem_block)); } prev = p; p = p->next; } // 没有符合条件的内存块,返回NULL return NULL; } // 释放内存块 void my_free(void* p) { mem_block* block = (mem_block*)((char*)p - sizeof(mem_block)); block->is_free = 1; // 尝试合并前面的空闲内存块 mem_block* prev = mem_start; mem_block* curr = prev->next; while (curr != NULL) { if (prev->is_free && curr->is_free) { prev->size += sizeof(mem_block) + curr->size; prev->next = curr->next; curr = prev->next; } else { prev = curr; curr = curr->next; } } // 尝试合并后面的空闲内存块 prev = mem_start; curr = prev->next; while (curr != NULL) { if (curr->is_free && (void*)((char*)prev + sizeof(mem_block) + prev->size) == (void*)curr) { prev->size += sizeof(mem_block) + curr->size; prev->next = curr->next; curr = prev->next; } else { prev = curr; curr = curr->next; } } } int main() { init_mem(); // 分配两个内存块 int* p1 = (int*)my_malloc(100); int* p2 = (int*)my_malloc(200); printf("p1 = %p\n", p1); printf("p2 = %p\n", p2); // 释放第一个内存块 my_free(p1); // 再分配一个内存块 int* p3 = (int*)my_malloc(50); printf("p3 = %p\n", p3); // 释放所有内存块 my_free(p2); my_free(p3); return 0; } ``` 这段代码实现了一个简单的动态分区分配算法,使用了链表来管理内存块,支持分配和释放内存块,并且在释放内存块时尝试合并相邻的空闲内存块,以减少内存碎片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值