Consiguiendo la diferencia entre dos direcciones de memoria.

Tengo la dirección de memoria de un int * : 0xbfde61e0. También tengo otra dirección de memoria (que también es int * . ¿Cómo puedo calcular la diferencia entre los dos para usarlos como un desplazamiento entre las dos ubicaciones?

Es tan fácil como parece.

 int a = 5; int b = 7; int *p_a = &a; int *p_b = &b; int difference = p_b - p_a; 

Tenga en cuenta que esto dará la diferencia como un múltiplo de sizeof(int) . Si quieres la diferencia en bytes, haz esto:

 int differenceInBytes = (p_b - p_a) * sizeof(int); 

Sin un código específico o una aplicación específica, no puedo obtener más detalles que eso.

Realmente me gustaría más detalles sobre cómo está utilizando esta información. Eso podría hacer una respuesta mucho más concisa.

De todas formas. normalmente lo que sucede:

 int a = 1; int b = 2; int * w = &a; //0xbfdfa900 - These are right next to each other on the stack since int * x = &b; //0xbfdfa904 they were declared together int y = (int)w; int z = (int)x; int diff = w - x; // There's a 4 byte difference in memory, but I'd get diff = 1 // here because the compiler knows they're ints so I'm getting // diff/sizeof(int) int pdiff = y - z; // Now I'm going to get the number of bytes difference, so // pdiff = 4 as this is due to using the address as a raw value 

Hay cómo obtener las dos compensaciones diferentes entre dos punteros. Ahora, obviamente, si los punteros no están uno junto al otro en la stack, los valores comienzan a cambiar:

 int a = 1; int arr[5] = {0}; int b = 2; int * w = &a; //0xbfdfa900 - These are right off by 24 bytes (6 * sizeof(int)) int * x = &b; //0xbfdfa918 because we have 5 more ints there 

Cuanto mayor sea la distancia y los diferentes tipos entre los dos, más perderemos cualquier “compensación” obvia entre dos variables, en otras palabras, esto comenzará a perder sentido. Esta es la razón por la cual la aritmética de punteros realmente solo funciona en arreglos (porque se conocen como memoria contigua de un tipo en particular). Así como en tu caso:

 int * one = &somenum; // 0xbfde61e0 int * two = &someothernum; // 0xbfbf69e0 printf("%d\n", (int)two-(int)one); 2029568 bytes 

Estos son una buena distancia. Así que puedes restarlos, pero no estoy seguro de por qué harías esto.

Creo que esto consigue la compensación.

 int *a = &somevar; int *b = &anotherintvar; int offset = b - a;