内存的五大分区

结构体数组.   结构体指针->
//内存的五大分区: 栈区,堆区,静态去,常量区,代码区
//代码区:代码在编译后形成的二进制都放在代码区;
//常量区:放在常量区的常量是只读不可写的
    //    const int a = 5;//加了const关键字后就放在了常量区
    //    a = 6;//常量区的常量不能再次赋值
    //    const float b = 9;
    //    b = 8;
    //    char arr[] = "zhoujielun";
    //    arr[0] = 'Z';//此处是复制了常量区的字符串,所以可以改变
    //    char *arr1 = "zhoujielun";
    //    arr1[0] = 'Z';//用指针直接指向了常量区,并想通过指针修改字符串 常量区的常量不可以改变 导致系统程序崩溃
//静态区(全局区):
    //    static int a = 0;//这个变量经过static修饰放在了静态区
    //    静态区的变量只能初始化一次
    //    如果不给初始值 系统默认0
    //    程序退出才被释放
    //    放在花括号外面的变量 即 全局变量也是放在静态区的
//栈区:栈区里存放的是局部变量和函数参数
    //    特点:先进后出 从高到低分配 从低到高是使用 栈低栈顶
    //    int a = 5;
    //    int b = 6;
    //    int c = 7;
    //    printf("%p\n",&a);
    //    printf("%p\n",&b);
    //    printf("%p\n",&c);
    //    int arr[3] = {1,2,3};
    //    for (int i = 0; i < 3; i++) {
    //        printf("%p\n",&arr[i]);
    //    }
    //    通过指针 操作 返回栈内存是不安全的
    //    栈区的内存是系统自动分配和释放的 栈区的空间容量是特别小的
//堆区:是由程序员手动的分配和释放的 他的空间比较大
    //  char *arr = malloc(8);//malloc 堆区
    //    arr = "iphone";//7位 指针常量区
    //    free(arr);
    //  strcpy(arr, "iphone");
    //  printf("%s\n",arr);
    //  int *a = malloc(4);
    //  *a = 4;
    //  printf("%d\n",*a);
    //  free(a);//释放 内存都是标记删除的
    //  a = NULL;
//其他内存分配函数
    //calloc//自动清零
    //void *  = calloc(,);
//    int *p1 = calloc(10, 2);//第一个参数表示有几个,第二个参数表示每个站几个字节
//    for (int i = 0; i < 20; i++) {
//        * (p1 + i) = 2;
//        printf("%d",*(p1 + i));
//    }
//    printf("\n");
    //realloc
    //void *  = realloc(,);//第一个参数表示想重新分配的内存,第二个参数表示想重新分配的字节数
//    int *p2 = realloc(p1, 5);
//    for (int i = 0; i < 5; i++) {
//        *(p2 + i) = 2;
//        printf("%d",*(p2 + i));
//    }
//内存操作函数
    //初始化内存
    //memset 第一个参数是指针,第二个参数是设置内容(字符型的),第三个参数是几个字节
    int *p1 = malloc(8);
    int *p2 = memset(p1,107, 8);
    for (int i = 0; i < 8; i++) {
        printf("%c ",*(p2 + i));
    }
    //内存拷贝
    //memcpy 第一个参数是目的指针,第二个参数是源指针,第三个参数是分配几个字节
    char *p3 = malloc(5);
    p3 = memcpy(p3, p2, 5);
    for (int i = 0; i < 5; i++) {
        printf("%c",*(p3 + i));
    }
    //内存比较
    //memcmp 第一个参数是被减数,第二个参数是减数,第三个参数是比较几个字节 跟strcmp类似也是比较的ASCII码表的值
    char *p4 = malloc(8);
    char *p5 = malloc(8);
    memset(p4, 65, 8);
    memset(p5, 66, 8);
    int count = memcmp(p4, p5, 8);
    printf(" %d\n",count);
    int *a = malloc(3*sizeof(int));
    int *b = calloc(3,sizeof(int));
    memset(a, 0, 12);
    for (int i = 0; i < 3; i++) {
        *(a + i) = arc4random() % 4;
        *(b + i) = arc4random() % 4;
        printf("a=%d b=%d\n",*(a + i),*(b + i));
    }
    int count1 = memcmp(a, b, 12);
    if (count1 == 0) {
        printf("Good!");
    }
    else
        printf("Faided!");
 //练习:找出字符串中的数字 使用内存分配
   /* char arr[] = "a1b2c3d4";
//    int length = sizeof(arr)/sizeof(char);
//    for (int i = 0; i < length - 1 ; i++) {
//        if (arr[i] >= 48 && arr[i] <= 57) {
//            printf("%c ",arr[i]);
//        }
//    }
    int count = 0;
    char temp[100] = {0};
    for (int i = 0; i < strlen(arr); i++) {
        if (((*(arr + i)) >= '0') && (*(arr + i)) <= '9'){
            temp[count] = *(arr + i);
            count++;
           }
        }
        temp[count] = '\0';
        char *arr1 = malloc(sizeof(char) * (count + 1));
    strcpy(arr1, temp);
    printf("%s\n",arr1);
    free(arr1);
    arr1 = NULL;//释放
    //练习:输入3个姓名 保存输出 ,使用内存分配
    char *name[3] = {0};
    printf("请输入三个姓名:\n");
    for (int i = 0; i < 3; i++) {
        char temp[20] = {0};//空数组;
       // scanf("%s",*(name + i));
        scanf("%s",temp);
       //char *p
        *(name + i)= malloc(sizeof(char) * (strlen(temp) + 1));
        strcpy(*(name + i), temp);
    }
    printf("......................?.?.?.?.?.?.?.?.?.?.?.?........................\n");
    for (int i = 0; i < 3; i ++) {
        printf("%s\n",*(name + i));
    }//循环释放
    for (int i = 0; i < 3; i++) {
        free(*(name + i));
        *(name + i) = NULL;
    }*/

转载于:https://www.cnblogs.com/sharkHZ/p/4984217.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于您的要求给出的 Python 代码: ```python import numpy as np import time import matplotlib.pyplot as plt from memory_profiler import memory_usage def run_experiment(nodes): start_time = time.time() # 这里模拟一个复杂的多项式计算 result = np.exp(np.sin(nodes)) + np.log(np.sqrt(nodes)) end_time = time.time() run_time = end_time - start_time mem_usage = memory_usage((result,)) return run_time, mem_usage[0] # 生成500个节点 nodes = np.random.rand(500) # 计算不分区时的运行时间和内存使用情况 no_partition_time, no_partition_mem = run_experiment(nodes) # 将节点分成大小相等的五组 groups = np.array_split(nodes, 5) # 计算分区后的运行时间和内存使用情况 group_size_time, group_size_mem = [], [] for group in groups: t, m = run_experiment(group) group_size_time.append(t) group_size_mem.append(m) # 将节点按其数值大小分成5组 groups = np.array_split(nodes[np.argsort(nodes)], 5) # 计算分区后的运行时间和内存使用情况 group_value_time, group_value_mem = [], [] for group in groups: t, m = run_experiment(group) group_value_time.append(t) group_value_mem.append(m) # 将节点按其奇偶性分成2组 groups = np.array_split(nodes[np.argsort(nodes % 2)], 2) # 计算分区后的运行时间和内存使用情况 group_parity_time, group_parity_mem = [], [] for group in groups: t, m = run_experiment(group) group_parity_time.append(t) group_parity_mem.append(m) # 绘制折线图 plt.plot([0, 1], [no_partition_time, group_size_time[0]], label='分成大小相等的五组') plt.plot([0, 1], [no_partition_mem, group_size_mem[0]], label='分成大小相等的五组') plt.plot([0, 1], [no_partition_time, group_value_time[0]], label='按节点数值大小分成五组') plt.plot([0, 1], [no_partition_mem, group_value_mem[0]], label='按节点数值大小分成五组') plt.plot([0, 1], [no_partition_time, group_parity_time[0]], label='按节点奇偶性分成两组') plt.plot([0, 1], [no_partition_mem, group_parity_mem[0]], label='按节点奇偶性分成两组') # 绘制其他分区方法的折线 plt.legend() plt.show() ``` 这个代码将节点分成了三种分区方式:按其大小分成大小相等的五组、按其数值大小分成大小相等的五组、按其奇偶性分成两组。你可以根据自己的需求修改分区方法。运行这个代码会生成一个折线图,其中包含了不分区和三种分区方法的运行时间和内存使用情况的对比。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值