【发布时间】:2016-11-25 10:04:09
【问题描述】:
malloc() 函数返回void* 类型的指针。它根据作为参数传递给它的size_t 值以字节为单位分配内存。结果分配是原始字节,可用于 C 中的任何数据类型(无需强制转换)。
在返回void * 的函数中声明的类型为char 的数组是否可以用于任何数据类型,例如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;
}
【问题讨论】:
-
没有。像
char array[n];这样的数组 具有 声明类型:字符数组。通过char(或其他字符类型)以外的类型的左值访问它是未定义的。[m/c/re]alloc()的特殊之处在于它们分配内存没有声明的类型。 -
char*可以为任何类型设置别名。但反之亦然。基本上,您在这里尝试以int*的身份访问char*,这违反了此规则。 -
@machine_1 静态字符数组为转换类型正确对齐是无效的。
-
您可以将任何指针返回为
void *。但是你只能用它的有效类型来取消引用它! -
@machine_1:C11 标准草案 n1570:6.5 表达式 6 访问其存储值的对象的有效类型是对象的声明类型(如果有)。 87) 如果通过具有非字符类型类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及后续访问不修改存储的值。