使用为其他类型声明的内存

时间:2013-11-06 12:04:13

标签: c memory types malloc

如果我要为四个字节的变量初始化内存,我是否可以将两个双字节变量指向为其存储的内存? 我正在努力进一步了解内存管理和理论。

我正在采取的一个例子:

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到第一个项目,并通过位图访问它们吗?显然这主要是为了理论,因为我觉得问题会有更好,更明显的答案。

4 个答案:

答案 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
 */