关于C语言的memset容易出现的问题

今晚一个关于memset函数的问题一直调试不出来。部分代码如下:


const unsigned int unmarked = 10000;
int* diag_map = (int*)malloc(sizeof(int)*(num_rows+num_cols));
memset(diag_map,unmarked,sizeof(int)*(num_rows+num_cols));
for(i=0;i<num_nonzeros;i++){
    if(diag_map[i] == unmarked){
        //TODO
    }
}

经排查,发现diag_map[i] == unmarked 这个条件一直不成立。仔细分析发现:

unsigned int 有一个特性就是如果将其赋值或者当作字节来使用的话,编译器将会截取低八位作为一个字节使用。

而memset函数进行内存初始化的时候恰好是根据字节填充的。所以将取10000的低八位就是00010000B作为字节使用。

在我的机器上,int占用四个字节,因此数组初始化后,本来想要每个元素都为10000.

但实际上每个元素为00010000000100000001000000010000B即为269488144.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DES算法是一种对称加密算法,其加密和解密使用相同的密钥,密钥长度为56位。下面是使用C语言实现DES算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <openssl/des.h> void des_encrypt(char *key, char *input, char *output) { DES_cblock des_key; DES_key_schedule schedule; DES_cblock input_block, output_block; int i; // 初始化密钥 memset(des_key, 0, sizeof(des_key)); memcpy(des_key, key, strlen(key) > 8 ? 8 : strlen(key)); DES_set_key_checked(&des_key, &schedule); // 分块加密 for (i = 0; i < strlen(input); i += 8) { memset(input_block, 0, sizeof(input_block)); memcpy(input_block, input + i, strlen(input + i) > 8 ? 8 : strlen(input + i)); DES_ecb_encrypt(&input_block, &output_block, &schedule, DES_ENCRYPT); memcpy(output + i, output_block, 8); } } void des_decrypt(char *key, char *input, char *output) { DES_cblock des_key; DES_key_schedule schedule; DES_cblock input_block, output_block; int i; // 初始化密钥 memset(des_key, 0, sizeof(des_key)); memcpy(des_key, key, strlen(key) > 8 ? 8 : strlen(key)); DES_set_key_checked(&des_key, &schedule); // 分块解密 for (i = 0; i < strlen(input); i += 8) { memset(input_block, 0, sizeof(input_block)); memcpy(input_block, input + i, 8); DES_ecb_encrypt(&input_block, &output_block, &schedule, DES_DECRYPT); memcpy(output + i, output_block, 8); } } int main() { char key[] = "12345678"; // 密钥 char input[] = "hello world"; // 明文 char output[100]; // 密文 char decrypt[100]; // 解密后的明文 // 加密 des_encrypt(key, input, output); printf("密文:%s\n", output); // 解密 des_decrypt(key, output, decrypt); printf("解密后的明文:%s\n", decrypt); return 0; } ``` 运行结果如下: ``` 密文:�s��5�� 解密后的明文:hello world ``` 需要注意的是,由于DES算法使用的是分块加密,在加密和解密时需要对明文进行补齐。上面的示例代码中使用的是在明文不足8个字节时使用0来进行补齐的方式,这种方式容易造成安全隐患,实际应用中应该采用更加安全的补齐方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值