main函数
main函数也称主函数,许多书上特意强调main函数是整个函数的入口,但这种说法不正确,实际上main函数在执行之前已经做了一些初始化工作,在main函数执行之后也有一些扫尾工作。
根据C99的标准,main函数有两种形式:一种是无参,一种是带参。
int main()
int main(int argc, char *argv[])
两种形式的main函数的返回值都是int类型,虽然有些程序员习惯将main函数的返回值写成void类型,并且在某些编译器上也能够正常执行,但这并不是标准的main函数,标准main函数的返回值是int类型,所以main函数中的最后一行代码是return 0,其中0表示main函数正确结束。
main函数的参数是固定的:第一个参数argc是argument count的缩写,整数类型,表示通过命令行输入的参数个数;第二个参数argv是argument value的缩写,字符串指针数组类型,其中首元素argv[0]是程序的名字,其余元素为通过命令行输入的参数。
简述main函数执行前后都发生了什么
main函数第一行代码执行之前会调用全局对象和静态对象的构造函数,初始化全局变量和静态变量;main函数最后一行代码执行之后会调用atexit中注册的函数,并且调用顺序与注册顺序相反。
实践,返回一个64整数倍的内存
要想保证返回的地址中能存在能被64整除的地址,最保险的办法是额外申请64个地址空间,这样即便申请空间的首地址刚好错过64的倍数,加上额外的64个地址空间也能保证在整个地址空间中,前64个地址空间必然存在一个64整倍数的地址,并且后面剩余的地址空间不少于最初申请的大小。
void* align64malloc(int size)
{
void *ptr = malloc(size + 64 +sizeof(void*));
if(!ptr)
{
return NULL;
}
ptr = (char*)ptr + sizeof(void*);
*((int*)(((int)ptr + 64 - (int)ptr % 64)-sizeof(void*))) = ((int)ptr - sizeof(void*));
return(void*)((int)ptr +64 - (int)ptr %64);
}
#include <iostream>
#include <cstdlib>
void* align64malloc(int size)
{
void *ptr = malloc(size + 64 + sizeof(void*));
if (!ptr)
{
return NULL;
}
ptr = (char*)ptr + sizeof(void*);
*((int*)(((int)ptr + 64 - (int)ptr % 64) - sizeof(void*))) = ((int)ptr - sizeof(void*));
return (void*)((reinterpret_cast<int>(ptr) + 64 - reinterpret_cast<int>(ptr) % 64));
}
int main()
{
int size = 100;
void* aligned_ptr = align64malloc(size);
if (aligned_ptr)
{
std::cout << "Aligned memory block allocated successfully." << std::endl;
}
else
{
std::cout << "Failed to allocate aligned memory block." << std::endl;
}
free(aligned_ptr); // Remember to free the allocated memory
return 0;
}
分配成功,但是存在Debug异常。