AuA*_*AuA 5 c pointers memory-management
据我了解,在c中,指针指向内存地址。在下面的代码中
char *cp;
someType *up; // Assuming that someType is a union of size 16 bytes
cp = sbrk(nu * sizeof(someType));
// Here is what confuses me
up = (someType *)cp;
Run Code Online (Sandbox Code Playgroud)
根据此链接http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays
如果cp指向0x1234的地址,那么0x1234应该是新分配的内存的开头,对吧?
因此,当“cp”被转换为指向someType的指针并分配给“up”时,它实际上表示“up”是一个指向0x1234的指针,假设在32位系统中,每个内存地址占用4个字节,一个someType对象会使用4个内存地址来存储它的值,所以地址0x1234、0x1235、0x1236、0x1237共同存储了一个someType对象,这是正确的吗?
提前致谢。
指针类型转换在机器级别不执行任何操作。内存中的值仍然只是内存中的普通旧值。
在语言级别,该值用作地址。换句话说,它经常用作传递给需要内存位置的操作的值,例如程序集“加载”操作。
在语言级别,额外的构造被添加到机器操作中,而这些“额外”之一就是数据类型。编译器负责检查是否存在类型规则违规,但在运行时不存在这样的约束。
因此,强制转换在运行时不执行任何操作,但在编译时它指示编译器不要发出错误,因为指针值的类型现在将被视为与保存地址的变量兼容的类型。