Tengo un string en main y me gustaría pasar la dirección de esa cadena a una función que editará el contenido de esa cadena. No quiero usar malloc.

Mi código actualmente tiene este aspecto:

int main(){
        char* str = "Hello";
        char* para1[] = {"Tea", "Coffee"};

        printf("str: %s\n para1: %s\n", str, para1[0]);

        my_func(str, &para1);

        printf("str: %s\n para1: %s\n", str, para1[0]);

        return 1;
}

int my_func(char* str, char** para1){
        printf("str: %s\n", str);
        str[0] = 'W';
        para1[0] = "Popcorn";

        return 1;
}

No entiendo cómo puedo cambiar la primera letra de la cadena de H a W

¿Podría explicarme lo que estoy haciendo mal?

1
Monil 23 sep. 2016 a las 05:31

3 respuestas

La mejor respuesta

Los literales de cadena son de solo lectura. Cuando define:

char* string_literal = "Hello";

Obtiene un puntero al texto "Hola" que reside en la memoria de solo lectura.

Si declara esto como una matriz de caracteres:

char string[] = "Hello";

Luego puede modificar el contenido de string con la notación de índice de matriz:

string[0] = "W";

Ahora, puede reemplazar un puntero a un literal de cadena con un puntero a otro literal de cadena. Por ejemplo,

string_literal = "New string literal";

Porque aquí lo que realmente estás haciendo es reasignar el puntero llamado "string_literal" para que apunte a otra dirección en la memoria. El puntero en sí se puede escribir, pero la memoria a la que apunta es de solo lectura. Es por eso que su asignación a para1 tiene éxito.

5
David 23 sep. 2016 a las 02:39

Los literales de cadena se almacenan en parte de la memoria de solo lectura , por lo que no puede modificarlos.

2
Community 12 abr. 2017 a las 07:31

Los literales de cadena son no modificables , ya que generalmente se almacenan en la sección de datos inmutables de su archivo ejecutable.


No se trata de tu función, toma este ejemplo de juguete, por ejemplo:

include <stdio.h>

int main(void)
{
    char* str = "Hello";
    str[0] = 'g';
    printf("%s\n", str);
    return 0;
}

Debería resultar en un error de tiempo de ejecución, obtuve:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
Bus error: 10

Hay toneladas de información sobre el tema, por lo que no ampliaré más.

2
gsamaras 23 sep. 2016 a las 02:36