typedef struct block
{
size_t size;
struct block* next;
} node;
static char arr[1000];
arr
会发生什么当我做的时候
node* first_block = (node*)arr;
我明白这等于
node* first_block = (node*)&arr[0];
但
sizeof(node) = 8;
sizeof(arr[0])= 1;
所以第一个元素覆盖arr中的下一个七个元素,因为它的结构现在呢?你能解释一下这个演员吗?
答案 0 :(得分:6)
写作时
node* first_block = (node*)arr;
你没有改变内存中的任何东西,你得到一个指向内存区域的指针,指针的类型决定了如何处理关于指针算术的区域。
first_block->next
将是一个由数组中的字符确定的指针。
作为比较说你有一个指向同一个数组的char *指针
(如果arr在全局范围内声明,它将包含0' s)
char* q = arr;
node* p = (node*)arr;
arr[1000]
+----------------------+
q -> | | | | |
| 0 | 0 | ... | 0 |
p -> | | | | |
+----------------------+
当你做
时q = q + 1;
// you move the character pointer one char forward since q is a char pointer
当你做
时p = p + 1;
// you move the node pointer sizeof(node) chars forward since p is a node pointer
当你执行* q时,你得到q指向的字符值,* p给你char arr的节点值,即字符被解释为节点结构。
答案 1 :(得分:0)
它与指针算法有关,当你有一个指针type *pointer
时,你就这样做了
type *next = pointer + 1;
或
type *next = &pointer[1];
你有效地做到了这一点
type *next = ((char *)pointer + sizeof(type));
答案 2 :(得分:0)
当代码进行“投射”时,数据没有任何反应。 但是,
编译器会根据演员的持续时间/范围对这些数据进行不同的处理。
演员表的持续时间/范围(几乎总是)只包含演员表的声明。
答案 3 :(得分:0)
内存不知道类型,因此在投射时没有任何反应。 C中的类型只描述了如何解释内存中的字节。
您可以将8个字节的序列视为8个ASCII字符(char[8]
)或struct node
。转换只会更改数据视图,但数据不会受到影响。