2

查看以下初始化结构的方法,您可以看到 malloc 在 main 中没有用于分配大小params,它只是立即指向array。它正确打印了值,但这是有效的做法/如果我在分配之前分配大小有什么区别?

typedef struct _param_t {
    char * params;
} param_t;

int main()
{
    int i;
    param_t r;
    unsigned char array[5] = {0x01 , 0x02 ,0x03 ,0x04 ,0xFF};
    r.params = (char *) array;
    
    for (i = 0; i < 5; i++) {
        printf(" Array %d is %x", i, r.params[i]);
    }
    
    return 0;
}

输出:

Array 0 is 1 Array 1 is 2 Array 2 is 3 Array 3 is 4 Array 4 is ffffffff               

另一方面,这是用于写入文件的 fwrite 原型:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
             

它接受一个空指针。主要是,我将数组转换为 a(char *)以填充结构。我知道有符号 T* 和无符号 T* 之间的转换通常是可能的

我的问题是,以VS作为参数以二进制模式r.params写入文件有什么区别?两者尺寸相同。因此不应该有所作为,然后从文件中读取的内容可以存储在 char 数组或 unsigned char 数组中而不会丢失数据,对吗?sizeof(unsigned char)sizesizeof(char)size

4

2 回答 2

0

应该没有什么区别。C 标准对字符类型的要求相当严格:必须为 1 个字节,不得包含填充位或陷阱表示。因此,无论在给定系统上是有符号还是无符号,char它很可能具有相同的二进制表示。在不同的字符类型之间进行转换也是非常安全的。unsigned charchar

通常,当您想使用原始二进制表示时,请改用uint8_tnever char

正如您所指出printf的,函数系列将提升小整数类型int。因此,如果char已签名,则 impl.defined 转换为 2 的补码负数将在 0xFF 情况下发生。升级到 32 位int后,这是“符号扩展为”0xFFFFFFFF,然后使用说明符将其打印为无符号数,该%x说明符需要 type unsigned int

于 2020-08-17T07:44:23.383 回答
-2

你的问题的答案是否定的。

数据始终以二进制形式存储

Data types编程语言中的存在只是为了便于编写代码

例如:

char character = `c`;    // binary stored in character is 0110 0011

unsigned char variable = character // will store 0110 0011 in variable

并且pointers仅用于访问变量的内存位置。

char因此,当您使用 a指向a 时unsigned char*,只会更改数据的解释方式,但其背后的二进制文件是相同的

于 2020-08-17T08:35:14.493 回答