En C se dice que cuando los punteros se refieren a la misma matriz o un elemento más allá del final de esa matriz, la aritmética y las comparaciones están bien definidas. Entonces, ¿qué pasa con uno antes del primer elemento de la matriz? ¿Está bien siempre que no lo desreferencia?
Dado
int a[10], *p;
p = a;
(1) ¿Es legal escribir --p
?
(2) ¿Es legal escribir p-1
en una expresión?
(3) Si (2) está bien, ¿puedo afirmar eso p-1 < a
?
Hay cierta preocupación práctica por esto. Considere una reverse()
función que invierte una cadena en C que termina con '\0'
.
#include <stdio.h>
void reverse(char *p)
{
char *b, t;
b = p;
while (*p != '\0')
p++;
if (p == b) /* Do I really need */
return; /* these two lines? */
for (p--; b < p; b++, p--)
t = *b, *b = *p, *p = t;
}
int main(void)
{
char a[] = "Hello";
reverse(a);
printf("%s\n", a);
return 0;
}
¿Realmente necesito hacer la verificación en el código?
Comparta sus ideas desde el punto de vista del abogado del idioma / perspectivas prácticas, y cómo enfrentaría tales situaciones.