C Указатель (адрес, разыменование, переназначение)

77
9

Я пытаюсь написать функцию, которая будет обращаться к байту и изменить его для другого. У меня проблемы с управлением указателями.

Может ли кто-нибудь помочь мне исправить этот код, так что px указывает на адрес, и я могу прирастить pc (что то же самое, что и px, но так же, как char, чтобы не увеличивать слишком много байтов), а затем заменить то, что находится в памяти mem pc с что-то другое?

unsigned replace_byte(unsigned x, int i, unsigned char b){
unsigned int* px = &x; //Takes initial address of first byte.
unsigned char* pc= (unsigned char*)px; //Recast it too char
//pointer to avoid incrementing by too many bytes
if (i==0) {
*pc= b; //if i is 0 then replace the byte at mem location pc
//with b
}
if (i==1) { //if i is 1 or more then inc by that much and replace
pc = pc+1;
*pc= b;
}
if (i==2) {
pc=pc+2;
*pc= b;
}
if (i==3) {
pc=pc+3;
*pc= b;
}
return x;
}

Я получаю возвращаемые значения следующим образом: 305419947 305441656 313218680 2872333944

Когда я захочу получить такие значения:

replace_byte (0x12345678, 0xAB, 2) → 0x12AB5678 replace_byte (0x12345678, 0xab, 0) → 0x123456AB

спросил(а) 2017-09-07T23:54:00+03:00 3 года, 9 месяцев назад
1
Решение
63

Это отлично сработало для меня:

#include <stdio.h>

unsigned replace_byte(unsigned x, int i, unsigned char b){
unsigned int px = x;
unsigned char* pc= (unsigned char*) &px;
if (i > 3) return px;
*(pc + i) = b;
return px;
}

int main()
{
int a = 0x12345678;
a = replace_byte(a, 2, 0x7F); // any hexadecimal character in parameter 3
printf("%x", a);
}

ответил(а) 2017-09-08T00:20:00+03:00 3 года, 9 месяцев назад
45

Этот код демонстрирует, как работает изменение конкретного байта типа int.

#include <stdio.h>

int main() {
unsigned int i = 0xffffffff;

//// make two pointers to the one memory address
// x - pointer to int. The address will be shifting by 4 bytes, when this
// pointer will be shifting by 1.
int *x = &i;

// y - pointer to char. The address will be shifting by 1 byte, when this
// pointer will be shifting by 1.
char *y = (char *) x;

//addresses the same here.
printf("x address = %p\n", x);
printf("y address = %p\n", y);
puts("");
//both pointers are shifting by 1, but addresses are different now.
printf("x + 1 = %p\n", x+1);
printf("y + 1 = %p\n", y+1);
puts("");
//changing the 'i' original value by one byte in turns, one after another.
printf("i - original: %x\n", i);

*y = 16;
printf("i - the first byte changed: %x\n", i);

*(y+1) = 16;
printf("i - the second byte changed: %x\n", i);

*(y+2) = 16;
printf("i - the third byte changed: %x\n", i);

*(y+3) = 16;
printf("i - the forth byte changed: %x\n", i);

return 0;
}


Вывод:

x address = 0x7fffe59e9794
y address = 0x7fffe59e9794

x + 1 = 0x7fffe59e9798
y + 1 = 0x7fffe59e9795

i - original: ffffffff
i - the first byte changed: ffffff10
i - the second byte changed: ffff1010
i - the third byte changed: ff101010
i - the forth byte changed: 10101010

ответил(а) 2017-09-08T03:15:00+03:00 3 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема