首页 > 其他分享 >Sword 指针的最后一位一定是0

Sword 指针的最后一位一定是0

时间:2023-03-02 21:58:57浏览次数:40  
标签:Sword 32 一位 char 内存 student pst 指针

/* 指针的最后一位一定是0 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
    网上有文章说"无论是32位还是64位机器,其地址的最后一位肯定是0(利用了指针的最后一位一定是0这一特性)" ,
    这个理论我觉得是有问题的,因此我设计如下代码证明32位机器下,对象指针的最后一位不一定是0
*/

#define DEFAULT_BUFFER_LENGTH 1024

typedef struct student_s student_t;

struct student_s
{
    int age;
    char gender;
};

void test()
{
    unsigned char* p = NULL;
    student_t    * pst;

    do 
    {
        // 2.申请内存空间
        p = (unsigned char*)malloc(1);
        if (NULL == p)
        {
            break;
        }

        /*
        设计说明:
            系统的malloc函数分配的内存,指针地址一般都是内存对齐的,这是为啥呢?
            因为目前操作系统要么是32位的,要么是64位的
            我们假定操作系统是32位,那么操作内存每次至少读取4个字节
            内存地址从0开始,每次读取肯定也是4的倍数,例如你的变量是char类型,并且你的变量是操作系统分配的,
            实际上需要多读取3个字节。
            那么我们调用系统函数malloc意味着分配一块内存,这块内存肯定也是从4的倍数地址上分配,谁让从内存寻址的时候只能是4的倍数呢
            如果一个数是4的倍数,换算成二进制,末尾2位肯定是0,因为需要满足 num%4=0,即左移2为0
        */
        printf("the value of the pointer <p> address: %p\n", p);

        // 3.创建一个student_t对象
        pst = (student_t*)((unsigned char*)p + 1);

        printf("the value of the pointer <pst> address: %p\n", pst);

        /*
        这的pst指针的最后一位就不是0,因为这个pst不算是系统分配的地址,而是程序员分配的。
        那么或许有人说一般人不会使用这种方式创建对象,一般情况下是,但是如果使用了第三方内存管理库就要小心了,你的内存可未必是系统给你分配的,
        有可能从一块大内存是弄的一小块,此时上面那个逻辑就会存在致命缺陷。

        一步一拳功夫意念要专心
        */


    } while (0);

    // 释放内存
    if (p)
    {
        free(p);
        p = NULL;
    }
}

int main()
{
    test();
    return 0;
}

 

标签:Sword,32,一位,char,内存,student,pst,指针
From: https://www.cnblogs.com/zhanggaofeng/p/17173688.html

相关文章

  • openfoam 智能指针探索
    前言今天看到一个程序,用到了智能指针,virtualtmp<volScalarField>rho()const;借此机会把有关智能指针的知识体系重新梳理一遍智能指针autoPtr的由来:首先要说明智......
  • 数组指针
    数组指针:本质是指针变量,保存的是数组的首地址例如:int(*p)[5]=NULL;数组首元素地址。例如:intarr[3]={10,20,30};  arr就是首元素地址(&arr[0]==arr),a......
  • 04-Go字符串、指针、结构体
    1字符串packagemain//字符串funcmain(){varastring="helloworld"//1按索引取值,只能取,不能改fmt.Println(a[0])//104utf-8对照......
  • 使用C#和Selenium将鼠标指针(光标)移动到特定位置或元素
    使用C#和Selenium将鼠标指针(光标)移动到特定位置或元素 我使用Selenium和C#执行单击操作。我可以执行点击操作,但我不能将鼠标指针(光标)移动到特定坐标或特定元素上。Ac......
  • 数组元素的指针变量
    数组元素的指针变量和数组名(作为地址)等价  在使用中,[]就是*()的缩写 为啥arr==&arr[0]&arr[0]==&*(arr+0)==arr+0==arr指向......
  • 数字序列中某一位的数字
    数字以0123456789101112131415...的格式作为一个字符序列,在这个序列中第2位(从下标0开始计算)是2,第10位是1,第13位是1,以此类题,请你输出第n位对应的数字。......
  • 比较含退格的字符串---双指针
    比较含退格的字符串给定s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。注意:如果对空文本输入退格字符,文本继续为空......
  • 数组遇上指针
    //一个8位的空间,如果表示无符号数0-255unsignedchar0~2^8-1//如果用来表示有符号数-128~127char-2^7~2^7-1//对其范围的探求,不止于,自字节数#i......
  • 按要求编写字符界面(算法初阶、最小值和最大值)、填充每个节点的下一个右侧节点指针(
    按要求编写字符界面(算法初阶、最小值和最大值)编写一个字符界面的JavaApplication程序,接受用户输入的10个整数,并输出这10个整数的最大值和最小值。importjava.util.Sc......
  • C语言 指针参数 示例代码
    指针参数的DEMO#include<stdio.h>voidhex_printf(char*buf,intbuf_len){inti=0;if(NULL==buf){return;}printf("leni......