c语言zero(void),各种void

1. void

这个不难理解, 就是一个空类型.

1) 可以用在函数, 例如: void fun(int, int)

2) 可以用在函数参数, 例如:void fun(void), int main(void)

3) 可以用来强制类型转换, 例如:#define ZERO (void)0.

此时ZERO便不能做右值, 也就是说, int a=ZERO这样的语句会出现错误, 编译不了. 但如果将之前两句改为改为

#define ZERO 0;

int a=ZERO;

则编译器不会出错, 程序也能正常运行, a的值也会变为0;

4) 不能作为数据的类型, 例如: void a; 想定义一个void类型的a变量的时候, 编译器会报错.

2. void *

这个比void稍微难理解, 这是一个万能的指针类型, 而不是空指针类型.

1) 在c的stddef.h或stdio.h里面, 都可以找到这样一段话

#ifndef NULL

#ifdef  __cplusplus

#define NULL    0

#else

#define NULL    ((void *)0)

#endif

#endif

这段程序定义了NULL这个宏. 关键看红色那一句. 我们都知道NULL代表一个任意类型的空指针,  void *的意思跟NULL也就异曲同工. (void *)后面那个0代表空指针NULL指向的内存地址为0, 外面再套一层括号是因为宏的安全问题(有关c语言的宏的使用问题, 可以百度一下, 这里不展开论述).

2) 我们先看一段程序

#include

int main()

{

int *p=new int;

double *pp=new double;

void *ppp;

*p=1;

*pp=1.1;

ppp=p;

printf("%d\n",*(int *)ppp);//强制类型转换为int的指针, 再加*取值

ppp=pp;

printf("%lf\n",*(double *)ppp);//强制类型转换为double的指针, 再加*取值

return 0;

}

各定义一个int, double和void类型的指针, 把p地址的值赋为1, pp地址的值赋为1.1, 再用万能指针ppp分别指向p的地址和pp的地址, 最后分别输出ppp指针指向的内存地址的值.

程序输出结果如下, ppp分别指向了p和pp并把里面的值输出.

0818b9ca8b590ca3270a3433284dd417.png

通过程序我们可以简单地了解了一下void *这个万能指针的含义.更多void *的信息请上网百度一下, 这里只是补充了一下网上说得比较少, 但又比较重要的内容

在C语言中,AES_128_cbc是一种基于Advanced Encryption Standard (AES)算法的安全加密技术,主要用于对数据进行块级加密。CBC(Cipher Block Chaining)模式下,需要对明文进行填充(Zero Padding),这是因为AES操作是以固定大小的块(16字节或128位)进行的。 零填充(Zero Padding)就是当原始数据长度不是16字节的倍数时,在数据末尾添加额外的零比特直到达到16字节整数倍。例如,如果要加密的数据长度是15字节,会添加一个0x00到末尾,变成16字节。其目的主要是为了保证每个AES块都能被加密,保持算法的完整性。 在C语言中,你可以使用OpenSSL库提供的AES CBC加密函数,如`AES_encrypt()`和`AES_set_encrypt_key()`等,来进行AES_128_cbc加密,并通过`PKCS7_pad()`函数进行零填充。这里是一个简化的示例: ```c #include <openssl/aes.h> #include <openssl/bio.h> #include <openssl/evp.h> void aes_cbc_encrypt(char *input, char *output, int len, const unsigned char *key, const unsigned char iv[AES_BLOCK_SIZE]) { AES_KEY aesKey; AES_set_encrypt_key(key, 128, &aesKey); // 128位密钥 unsigned char pad[16]; memset(pad, 0, AES_BLOCK_SIZE); pad[len] = len; // 根据实际长度填充 BIO *plaintext BIO = BIO_new_mem_buf(input, -1); BIO *cipher BIO = BIO_new(BIO_f_cipher()); BIO_set_cipher(cipher, EVP_aes_128_cbc(), NULL, &aesKey, iv, AES_ENCRYPT); BIO_push(cipher, plaintext); BIO_write(cipher, pad, AES_BLOCK_SIZE); BIO_gets(cipher, output, AES_BLOCK_SIZE + len); BIO_free_all(plaintext); BIO_free_all(cipher); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值