C语言分配4k对齐内存

摘要:
分配内存,按4k字节对齐。基本思想是首先分配大小为+4k-1字节的内存,然后在最初的4k字节中找到4k对齐地址,作为对齐内存的第一个地址,并返回它。当然,为了避免内存泄漏,应该保留初始内存地址。使用内存后,所有分配的内存都应该是空闲的。

分配内存,按4k字节对齐。亦即分配的内存指针指向的地址,低12位(二进制)均为0。

假设要分配size字节内存。基本思路就是先分配size+4k-1字节的内存,然后在起始的4k字节里,找到4k对齐的那个地址(即低12位为0),作为对齐内存首地址,返回。

当然为了避免内存泄漏,要保留初始分配的内存地址,在使用完内存后,需要free掉分配的所有内存。

#include <stdio.h>
#include <stdlib.h>
#define uintptr_t unsigned long long int
#define ALIGNED_BASE 0x1000
static void* alloc_4k_aligned_mem(int size, void**ppOut)
{
    *ppOut = (void*) calloc(1, size + ALIGNED_BASE - 1);
    printf("ppOut: %p
", *ppOut);
    if(!ppOut)
    {
        returnNULL;
    }
    void* pAligned = (void*)((uintptr_t)(*ppOut+ ALIGNED_BASE - 1) & ~(ALIGNED_BASE - 1));
    printf("pAligned: %p
", pAligned);
    returnpAligned;
}
intmain ()
{
    const char* CHARS = "0123456789ABCDEF";
    int size = 17;
    void*orig;
    char* p = (char*) alloc_4k_aligned_mem(size, &orig);
    if(!p)
    {
        printf("return -1.");
        return -1;
    }
    for(int i=0; i<size - 1; i++){
        *(p+i) = CHARS[i % 16];
    }
    printf("%s
", p);
    free(orig);
    return 0;
}

输出截图:

C语言分配4k对齐内存第1张

免责声明:文章转载自《C语言分配4k对齐内存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多附件的上传plsql导出数据和表结构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

    /****************************************************************  将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 ****************************************************************/#import...

Go标准库之读写文件(File)

Go标准库之读写文件(File) 创建一个空文件 package main import ( "log" "os" ) func main() { file, err := os.Create("empty.txt") if err != nil { log.Fatal("create file err"...

vscode利用dev配置c语言,VSCode搭建C++/C调试编译环境(使用DevC++)

关于VSCode使用Dev C++的MinGW64来调试C++/C网上的教程试了很多,大部分都已经过时了或者说是不适配了,最后就选择使用Dev原有的东西来实现,不建议自己下载MinGW64,里面安装的时候有些选项不知道选什么的话很容易出现问题。 配置Dev下MinGW64的路径 假设Dev已经安装好了,然后现在要做的就是将Dev目录下的MinGW添加到环境...

c语言:百元白鸡问题

#include<stdio.h>#include<math.h>int main(){ //设公鸡,母鸡,鸡仔各x,y,z只;  int x,y,z; for(x=0;x<=20;x++) {  for(y=0;y<=33;y++)  {   for(z=3;z<=300;z+=3)   {    if(((x+...

C语言文件读写操作总结

C语言文件操作 一、标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错)...

C获取系统中CPU核数

1、在Linux下获取CPU核数 linux下可以通过linux系统提供的sysconf()来获取当前CPU个数,sysconf在头文件unistd.h中声明。 sysconf函数中输入参数_SC_NPROCESSORS_CONF和_SC_NPROCESSORS_ONLN均可以获取系统CPU个数。 _SC_NPROCESSORS_CONF:返回系统所有的C...