【问题标题】:typedef char array as function parametertypedef char 数组作为函数参数
【发布时间】:2015-03-29 10:02:10
【问题描述】:

这里是C新手。 我写道:

typedef unsigned char HBLOCK[SHA512_DIGEST_LENGTH];
typedef unsigned char HPRINTABLE[sizeof(HBLOCK)*2];
typedef struct {
                HBLOCK Primary;
                HBLOCK *Part;
               } FILE_HASH_MAP;
void blockhex(const HBLOCK *, HPRINTABLE *);

打算编写将HBLOCK转换为十六进制字符串的函数。但是,当我尝试测试单个字符是否可分配时

void blockhex(const HBLOCK *block, HPRINTABLE *printable)
{
 printable[0]="6";
};

编译器说

error: incompatible types when assigning to type ‘HPRINTABLE’ from type ‘char *’.

这让我很困惑,因为我希望 HPRINTABLE typedef 能清楚地表明它是一个数组类型。 而且,当我这样称呼它时

FILE_HASH_MAP fhm;
HPRINTABLE prt;
blockhex(fhm.Primary,&prt);

编译器也说

warning: passing argument 1 of ‘blockhex’ from incompatible pointer type

note: expected ‘const unsigned char (*)[64]’ but argument is of type ‘unsigned char *’

当然,这些不是错误,但我还是想知道我做错了什么。

【问题讨论】:

    标签: c function typedef


    【解决方案1】:
    void blockhex(const HBLOCK *block, HPRINTABLE *printable)
    {
      printable[0]="6";
    

    printable[0] 是一个带有sizeof(HBLOCK)*2 元素的char 数组。 "6" 也是一个char 数组(有两个元素,即'6''\0')。

    在 C 数组中不能赋值。

    复制数组一般使用memcpy()

    memcpy(printable[0], "6", sizeof "6"); /* Note that sizeof "6" evaluates to 2,
                                              because of the `0`-terminator each 
                                              C-"string" carries. */
    

    要复制 C-“字符串”,使用 strcpy() 会更好/更容易,例如:

    strcpy(printable[0], "6");
    

    以上等价于:

    printable[0][0] = '6';
    printable[0][1] = '\0';
    

    更多关于如何在 C 中处理“字符串”的信息在这里:http://en.wikipedia.org/wiki/C_string_handling


    printable 成为char 数组,将其声明为HPRINTABLE printable,并且在调用blockhex(); 时不要在prt 上使用地址运算符&

    block 也一样。

    【讨论】:

    • 我知道无法分配数组。可以分配单个数组元素吗? printable[0]="6"; 有什么问题? ?
    • 那么你为什么要尝试编译器抱怨呢? @Barvinok
    • 我认为单个字符是单个字符,而不是数组。 strcpy() 是分配单个数组元素的唯一方法吗?
    • @Barvinok "6" 是一个数组。 (它有 2 个元素:'6''\0')。无法分配数组。
    • @Barvinok:'6' 将是单个 char。注意引号。
    猜你喜欢
    • 2018-04-21
    • 2022-11-16
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多