Указатели C: Когда вы разыменовываете указатель на символ и пытаетесь сохранить int, он будет хранить весь int? - PullRequest
3 голосов
/ 18 октября 2011

Допустим, у вас есть:

    void *p = // something;
    int size = 10;
    *((char *)p + 8) = size ^ 1;

Я знаю, это выглядит как действительно случайная логика, но мне было интересно, все ли будет так, как задумано.Я пытаюсь разместить весь размер "size ^ 1" по адресу, указанному "p + 8", когда p приведен к типу char.По сути, я спрашиваю, отличается ли это от:

    *((int *)p + 2) = size ^ 1;

Кроме того, что бы произошло, если бы я решил увеличить указатели на 3, например:

    *((char *)p + 3) = size ^ 1;

или (я знаю, что это не эквивалентно всем остальным, но хочу посмотреть, правильно ли это):

    *((int *)p + 3) = size ^ 1;

Ответы [ 3 ]

5 голосов
/ 18 октября 2011

Когда вы разыменовываете указатель char *, вы ссылаетесь на один char объект. Таким образом, это очень похоже на:

char c;

c = size ^ 1;

То есть результирующее значение (в данном случае 11) преобразуется в тип char и затем сохраняется в местоположении (char *)p + 8 (9-й char объект, на который указывает p).

Так что да, это сильно отличается от:

*((int *)p + 2) = size ^ 1;

Последняя строка изменяет весь объект int, размером sizeof(int), и измененный объект является третьим int объектом, на который указывает p.

Если мы представим, что у вас система с прямым порядком байтов с sizeof(int) == 4, то ваши четыре примера изменят память, указанную на p, следующими способами:

1.

*((char *)p + 8) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |

2

*((int *)p + 2) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |

3

*((char *)p + 3) = size ^ 1;

| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |

4

*((int *)p + 3) = size ^ 1;

| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |
1 голос
/ 18 октября 2011

*((char *)p + 8) = size ^ 1 неявно приводит значение size ^ 1 к char, что отбрасывает все байты, кроме младшего;так что нет, это не то же самое, что *((int *)p + 2) = size ^ 1.

0 голосов
/ 18 октября 2011

*((char *)p + 8) = size ^ 1; ничем не отличается от:

char something;
something = size ^ 1;

Вы можете понять это оттуда, но лучше просто попробуйте и узнайте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...