zoukankan      html  css  js  c++  java
  • C内存分配的注意点

    C语言的内存分配,有很多的注意点。
    1. int 的大小问题。int 在不同的编译器下大小是不一样的。在tc下是2位,在 vc 下,和 long 一样,是4位。
    2. memset 不是用来分配内存的,而是设置某个区域的内存为某个值,这个内存区域必须是可以修改的,
       而且是已经分配好了的。
       这个函数的原型为:
       void  *  memset(void * _Dst, int _Val, size_t _Size);
    第二个参数是int 实际上有些迷惑人。如果你输入了一个大于 256 的数,就会被截断了。只截取一个字节的数据。
    先看下面的代码:
        char s[] = "Hello World.";

        system(
    "cls");
        printf(
    "Before memset.\n");
        printf(
    "%s\n", s);

        memset(s, '1'
    2);

        printf(
    "After memset.\n");
        printf(
    "%s\n",s);
    Before memset.
    Hello World.
    After memset.
    11llo World.

    但是,下面的就不对了:

        int s[8];

        system(
    "cls");
        printf(
    "Before memset.\n");
        
    for (int i = 0; i < 8; i++) {
            printf(
    "%d ", s[i]);
        }
        putchar(
    '\n');

        memset(s, 
    18);

        printf(
    "After memset.\n");
        
    for (int i = 0; i < 8; i++) {
            printf(
    "%d ", s[i]);
        }
    Before memset.
    -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
    After memset.
    16843009 16843009 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
    这里只拷贝了两个字节。
    实际上,因为memset是逐字节拷贝,一个int 有 4个字节,这样
    16843009 = 00000001000000010000000100000001。占用了4次拷贝了。
    所以,对非char 类型的结构进行 memset 的时候,最好用 0, 或者 -1
    0 在计算机内部表示 是 0x00000000
    -1 在计算机内部的表示是 0xffffffff
    其他的值的初始化基本上没有意义。

    3. 对齐要求
    下面这个结构体占用几个字节呢?
    struct charintsize
    {
        int  a;
        char b;
    };
    答案是 8个,因为结构体有一个对齐原则。具体的,不需要知道怎么对齐,只要知道,不能简单的加和,而要用 sizeof 计算。
  • 相关阅读:
    记一次proc_open没有开启心得感悟
    Nginx 502 Bad Gateway 的错误的解决方案
    Linux安装redis,启动配置不生效(指定启动加载配置文件)
    设置redis访问密码
    LNMP 多版本PHP同时运行
    ***总结:在linux下连接redis并进行命令行操作(设置redis密码)
    设计模式(一)单例模式:3-静态内部类模式(Holder)
    设计模式(一)单例模式:2-懒汉模式(Lazy)
    设计模式(一)单例模式:1-饿汉模式(Eager)
    设计模式(一)单例模式:概述
  • 原文地址:https://www.cnblogs.com/niniwzw/p/1556656.html
Copyright © 2011-2022 走看看