在C中,当我们将int转换为struct *时,内存中会发生什么?

时间:2015-03-28 16:45:32

标签: c

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中的下一个七个元素,因为它的结构现在呢?你能解释一下这个演员吗?

4 个答案:

答案 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。转换只会更改数据视图,但数据不会受到影响。