Incremento de puntero nulo por un byte? por dos?

Tengo un puntero void llamado ptr. Quiero incremento de este valor por el número de bytes. Es allí una manera de hacer esto?

Por favor, tenga en cuenta que quiero hacer en este lugar sin crear más variables.

Podía hacer algo como ptr = (void *)(++((char *) ptr)); ?

InformationsquelleAutor Adam S | 2011-06-23

4 Kommentare

  1. 60

    Usted no puede realizar la aritmética en un puntero nulo porque la aritmética de punteros es definido en términos del tamaño de la punta de objeto.

    Puede, sin embargo, poner el puntero a un char*, hacer operaciones aritméticas en ese puntero y, a continuación, volver a convertir un void*:

    void* p = /* get a pointer somehow */;
    
    //In C++:
    p = static_cast<char*>(p) + 1;
    
    //In C:
    p = (char*)p + 1;
    • no debería ser reinterpret_cast?
    • es suficiente.
  2. 17

    No arithmeatic operaciones pueden hacerse en void puntero.

    El compilador no sabe el tamaño del elemento(s) de la void puntero que apunta. Usted puede convertir el puntero (char *) para hacerlo.

    Gcc, hay una extensión que trata el tamaño de un void como 1. así que se puede utilizar arithematic en un void* para añadir un offset en bytes, pero el uso que podría producir código no portable.

    • En GCC es posible porque sizeof(void) rendimientos 1.
    • Buyukliev: es la extensión del GCC, que trata del tamaño de un vacío como 1, Mediante que podría producir código no portable.
    • Como siempre, por favor compilar con -pedantic. 🙂
  3. 5

    Sólo el incremento de la void* sucede a trabajar en gcc:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() {
        int i[] = { 23, 42 };
        void* a = &i;
        void* b = a + 4;
        printf("%i\n", *((int*)b));
        return 0;
    }

    Es conceptualmente (y oficialmente) mal, aunque, por lo que desea hacer explícito: fundido a char* y luego de vuelta.

    void* a = get_me_a_pointer();
    void* b = (void*)((char*)a + some_number);

    Esto hace que sea obvio que estás incrementando en un número de bytes.

    • Como siempre, por favor compilar con -pedantic. 🙂 Es disconforme extensión por GCC.
    • Supongo que estoy echado a perder 🙂 – editado la respuesta para la corrección
  4. 0

    Que usted puede hacer:

    ++(*((char **)(&ptr)));
    • Sí, pero ¿por qué se? Que horrible ocultar el código que hace que sea innecesariamente difícil de analizar lo que está haciendo, por ninguna buena razón. Además, C-estilo de los yesos son para ser desalentado en C++, pero ese es el menor de los problemas de aquí.
    • También se puede meter un palo en llamas en sus ojos. Es probable que duele menos que mirar ++(*((char **)(&ptr)));.
    • Quería hacerlo en el lugar sin necesidad de crear más variables, por lo que me dio esta solución. Se puede ver como una manera instructiva, pero definitivamente no es para que lo use en su código.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea