char数组可以与任何数据类型一起使用吗?

mac*_*e_1 8 c arrays types c11

malloc()函数返回一个类型的指针void*.它根据size_t作为参数传递给它的值以字节为单位分配内存.生成的分配是原始字节,可以与C中的任何数据类型一起使用(无需转换).

可以char在返回的函数内声明类型的数组void *,可以与任何数据类型一起使用,例如生成的分配malloc

例如,

#include <stdio.h>

void *Stat_Mem();

int main(void)
{
    //size : 10 * sizeof(int)
    int buf[] = { 1,2,3,4,5,6,7,8,9,10 };

    int *p = Stat_Mem();

    memcpy(p, buf, sizeof(buf));

    for (int n = 0; n < 10; n++) {
        printf("%d ", p[n]);
    }
    putchar('\n');

    return 0;
}

void *Stat_Mem()
{
    static char Array[128];
    return Array;
}
Run Code Online (Sandbox Code Playgroud)

250*_*501 5

声明的静态对象类型Arraychar.该对象的有效类型是它的声明类型.无法更改静态对象的有效类型,因此对于程序的其余部分,有效类型Arraychar.

如果尝试访问具有与此列表1不兼容或不相关的类型的对象的值,则行为未定义.

您的代码尝试访问Array使用该类型的存储值int.此类型与类型不兼容,char并且不在异常列表中,因此当您使用int指针读取数组时,行为是未定义的p:

printf("%d ", p[n]);
Run Code Online (Sandbox Code Playgroud)

1(引用自:ISO:IEC 9899:201X 6.5表达式7)
对象的存储值只能由具有以下类型之一的左值表达式访问:
- 与对象的有效类型兼容的类型,
- a与对象的有效类型兼容的类型的限定版本,
- 与对象的有效类型对应的有符号或无符号类型的类型,
- 对应于对象的有效类型的有符号或无符号类型的类型对象的有效类型,
- 在其成员中包含上述类型之一的聚合或联合类型(包括递归地,子聚合或包含联合的成员),或
- 字符类型.