¿Cómo modificar una variable const en C?

Cada vez que usamos el calificador const con el nombre de la variable, se convierte en una variable de solo lectura y se almacena en el segmento .rodata. Cualquier intento de modificar esta variable de solo lectura dará como resultado un error de compilación: «asignación de variable de solo lectura».

En el siguiente programa, se intenta modificar una variable de solo lectura declarada usando el calificador const:

#include<stdio.h>
int main()
{
    const int var = 10;
    var = 15;
    printf("var = %d\n", var);
    return 0;
}

Salida :

prog.c: In function 'main':
prog.c:5:9: error: assignment of read-only variable 'var'

Cambiar el valor de una variable const a través del puntero

Las variables declaradas usando la palabra clave const, se almacenan en el segmento .rodata, pero aún podemos acceder a la variable a través del puntero y cambiar el valor de esa variable. Al asignar la dirección de la variable a un puntero no constante, estamos convirtiendo una variable constante en un puntero no constante. El compilador dará una advertencia al encasillar y descartará el calificador const. La optimización del compilador es diferente para variables y punteros. Es por eso que podemos cambiar el valor de una variable constante a través de un puntero no constante.
discarding const qualifier through non-const pointer

El siguiente programa ilustra esto:

//Write C code here
#include<stdio.h>
#include<stdlib.h>
int main()
{
    const int var = 10;
  
    int *ptr = &var;
    *ptr = 12;
  
    printf("var = %d\n", var);
  
    return 0;
}

Salida :

prog.c: In function 'main':
prog.c:6:16: warning: initialization discards 'const' qualifier 
from pointer target type [-Wdiscarded-qualifiers]
     int *ptr = &var;
var = 12

Nota : si intentamos cambiar el valor a través del puntero constante, obtendremos un error porque estamos tratando de cambiar el segmento de solo lectura.

Publicación traducida automáticamente

Artículo escrito por sheenam Bala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *