如果我要为四个字节的变量初始化内存,我是否可以将两个双字节变量指向为其存储的内存? 我正在努力进一步了解内存管理和理论。
我正在采取的一个例子:
int main() {
short* foo = malloc(4*(foo)); // sizeof(*foo)?
/*in which sizeof will return 2 so I could say
* malloc(20)
* so could I say malloc(2*sizeof(long))?
*/
}
或者通常在堆上声明彼此相邻的类型,即。一个块被保留很长时间,一个块被保留用于短类型变量?
修改的 我忘了提问。 如果我要声明两个彼此相邻的类型为short的变量(一个数组),我可以安全地指向一个long到第一个项目,并通过位图访问它们吗?显然这主要是为了理论,因为我觉得问题会有更好,更明显的答案。
答案 0 :(得分:2)
是。当你分配内存时,C并不关心类型 - 它只是你所要求的内存块。它会让你在它上面写下来,直到发生不好的事情!
如果你想要相邻值,数组是一个很好的方法:
int *myAllocatedArray = (int*)calloc(2, sizeof(int));
myAllocatedArray[0] = 100;
myAllocatedArray[1] = 200;
calloc
会将每个字节初始化为0。
答案 1 :(得分:1)
当然,您可以根据需要访问它。 从手册到calloc()和malloc()的信息很少:
SYNOPSIS
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
...
DESCRIPTION
The malloc() function allocates size bytes and returns a pointer to
the allocated memory. The memory is not initialized. If size is 0,
then malloc() returns either NULL, or a unique pointer value
that can later be successfully passed to free().
...
The calloc() function allocates memory for an array of nmemb elements
of size bytes each and returns a pointer to the allocated memory. The
memory is set to zero. If nmemb or size is 0, then calloc() returns
either NULL, or a unique pointer value that can later be successfully
passed to free().
...
答案 2 :(得分:1)
是的它会起作用,因为malloc接受整数参数,如: malloc(2 * 4),4 = sizeof(long),或类似malloc(20);
答案 3 :(得分:-1)
是的,正如其他人所说,C是一种弱类型的语言。这意味着它对类型转换的限制很少或没有限制。
例如:
void *ptr;
unsigned int *m;
unsigned int *e;
double *d;
ptr = malloc(sizeof(double));
d = ptr;
m = ptr;
e = ptr + 6;
*d = 123.456f;
printf("mantissa: %u\nexponent: %u\ndouble: %f\n", *m, *e, *d);
/* Output:
* mantissa: 536870912
* exponent: 16478
* double: 123.456001
*/