Soy nuevo en C, pero tengo un conocimiento bastante bueno de los compiladores y cómo funcionan los marcos de pila y cosas por el estilo. Estoy tratando de comprender cómo se asignan las matrices C en la pila y al mismo tiempo son punteros. Por ejemplo, tome el código:

int a = 101;
int b[5] = {1, 2, 3, 4, 5};

Me dijeron que b es un puntero aquí. p.ej. '* (b + 1) = 3;' es lo mismo que 'b [2] = 3'. ¿Significa esto que el marco de la pila aquí tiene un número entero para a, un puntero para b y una matriz (de 5 * tamaño de (int) bytes) que apunta b (he llamado a esta situación A) o simplemente un número entero? para ay una matriz para b (he llamado a esta situación B).

He creado una imagen para que esto sea un poco más claro: ingrese la descripción de la imagen aquí

Si la situación A es verdadera, ¿por qué los diseñadores de C han optado por implementar matrices de manera tan diferente a las variables? ¿No significa esto que una matriz necesita tener constantemente una búsqueda de memoria adicional para que el puntero obtenga su dirección?

2
Nick 13 dic. 2016 a las 14:13

2 respuestas

La mejor respuesta

¿Significa esto que el marco de pila aquí tiene un número entero para a, un puntero para b y una matriz (de 5 * tamaño de (int) bytes) que apunta b

int b[5] = {1, 2, 3, 4, 5};

Tu b es una matriz, no un puntero. Entonces b es un bloque de memoria que contiene cinco enteros consecutivos.

Si declara un puntero adicional

int *c = b;

Entonces eso se parecería a lo que describe en la situación B, es decir, tiene un puntero que apunta al comienzo de una matriz.

2
artm 13 dic. 2016 a las 11:19

C no tiene la noción de una pila . Usando la terminología correcta, podemos decir que

int b[5] = {1, 2, 3, 4, 5};

Tiene duración de almacenamiento automático .

Simplemente sucede que indexación de matrices es exactamente equivalente a desreferenciar un puntero, y la aritmética de punteros es válida dentro de matrices.

Entonces b[2] y *(b + 2) son equivalentes. Los diseñadores de C hicieron esto por claridad.

Lo que sucede en la "pila" es una opción de implementación, no de idioma.

La relación entre a y b no es particularmente relevante. Tenga en cuenta que no puede "alcanzar" a mediante una indexación curiosa de b (y ​​viceversa). El comportamiento al intentar hacer eso es indefinido .

4
Bathsheba 13 dic. 2016 a las 11:18