【问题标题】:Initialize an array of zeros in C [duplicate]在C中初始化一个零数组[重复]
【发布时间】:2018-04-16 18:17:50
【问题描述】:

为了加密密钥,我声明了unsigned char *

unsigned char *key = (unsigned char *)"0123456789012345";

我想让它的键都是0(不是ASCII字符'0')。


我对 C 有点生疏,所以我这样声明:

unsigned char *iv = (unsigned char *){0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

哪个给了我警告,那么我该如何正确地做到这一点?

【问题讨论】:

  • unsigned char *iv = (unsigned char []){0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 但这是非常奇怪的代码。
  • 我想知道为什么这些问题仍然被问到......并由应该更了解的金徽章用户回答......
  • 这种不友好的态度有必要吗? @Jean-François Fabre 如果它是重复的,那么只需向我推荐它
  • 不友好的态度并不是特别针对你。你可以用谷歌搜索它,但你没有 C 金徽章,所以这是情有可原的。
  • const unsigned char *key = (const unsigned char *)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 之类的怎么样?您想稍后在代码中更改 key 吗?

标签: c arrays initialization declaration


【解决方案1】:

你可以写

unsigned char iv[16] = { 0 };

至于这份声明

unsigned char *iv = (unsigned char *){0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

如果尝试使用复合文字,那么它的有效记录将看起来像在演示程序中显示的那样

#include <stdio.h>

int main(void) 
{
    enum { N = 16 };
    unsigned char *iv = ( unsigned char[N] ){ 0 };

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", iv[i] );
    putchar( '\n' );

    return 0;
}

它的输出

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

【讨论】:

    【解决方案2】:

    你必须为存储分配内存:

    unsigned char iv [16];
    memset (iv, 0, sizeof iv);
    

    或者:

    unsigned char *iv = calloc (16);  // allocates and initializes to NUL
    

    【讨论】:

    • 我相信calloc 也更安全,因为密钥不会以相同的相对偏移量分配给其他变量。但请注意,如果使用calloc,那么在大多数情况下也必须使用free,以避免内存泄漏。
    【解决方案3】:

    我建议使用 memset() 命令。

    memset(iv, 0, sizeof(*iv))
    

    编辑:我的错误,不小心漏掉了 iv 的星星

    【讨论】:

    • 这不起作用,因为sizeof(iv) 是指针的大小
    • 这是错误的,因为 sizeof(iv) 是指针的大小。使用sizeof(*iv) 可能是正确的,具体取决于iv 的定义方式。
    猜你喜欢
    • 2016-12-17
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多