nula * aritmética

#include int main(int argc,char *argv[]) { int i=10; void *k; k=&i; k++; printf("%p\n%p\n",&i,k); return 0; } 

¿Es ++ una operación legal en vacío *? Algunos libros dicen que no lo es, pero K & R no dice nada con respecto a la aritmética void * (pág. 93,103,120,199 de K & R 2 / e)

Por favor aclarar

PD: GCC no se queja al menos en k ++.

Es una extensión de GCC .

En GNU C, las operaciones de sum y resta se admiten en punteros para anular y en punteros para funciones. Esto se hace tratando el tamaño de un void o de una función como 1.

Si agrega la -pedantic producirá la advertencia:

warning: wrong type argument to increment

Si desea cumplir con el estándar, lance el puntero a un char* :

 k = 1 + (char*)k; 

El estándar especifica que uno no puede realizar la sum ( k+1 ) en void* , porque:

  1. La aritmética de punteros se realiza tratando k como el puntero al primer elemento (# 0) de una matriz de void (C99 §6.5.6 / 7), y k+1 devolverá el elemento # 1 en esta “matriz” (§6.5 .6 / 8).

  2. Para que esto tenga sentido, debemos considerar una serie de void . La información relevante para el void es (§6.2.5 / 19)

    El tipo void comprende un conjunto de valores vacío; es un tipo incompleto que no se puede completar.

  3. Sin embargo, la definición de matriz requiere que el tipo de elemento no pueda estar incompleto (§6.2.5 / 20, nota al pie de página 36)

    Dado que los tipos de objetos no incluyen tipos incompletos, no se puede construir una matriz de tipo incompleto.

Por lo tanto, k+1 no puede ser una expresión válida.

No, la aritmética en void* no está cubierta por la norma. Utilice char* para esto.

No puede incrementar un puntero a void . El comstackdor no sabe cuál es la estructura de tamaño de destino.

El estándar requiere que todos los operadores de aritmética de punteros requieran que el puntero sea un tipo de objeto completo. void es un tipo incompleto. GCC está haciendo lo incorrecto.

Arithmetic on void * es una extensión de GCC. Cuando compilo su código con clang -Wpointer-arith la salida es:

  test.c: 9: 4: advertencia: uso de la extensión void * de GNU [-Wpointer-arith]
 k ++;
 ~ ^

El comportamiento habitual de un incremento de puntero es agregar el tamaño del tipo de pointee al valor del puntero. Por ejemplo :

 int *p; char *p2; p++; /* adds sizeof(int) to p */ p2 += 2; /* adds 2 * sizeof(char) to p2 */ 

Como void no tiene tamaño, no debería ser capaz de realizar aritmética de punteros en los punteros void* , pero GNU C lo permite.

Intereting Posts