Estoy implementando una función básica de copia de cadenas en c así:
void copy(char* src, char* dst) { while (*src) { *dst = *src; dst++, src++; } }Yo lo llamo así:
int main(int argc, char* argv[]) { char* src = "Hello World!"; char* dst = "AAAAAAAAAAAA"; printf("Source: %s | Des: %s\n", src, dst); copy(src, dst); printf("Source: %s | Des: %s", src, dst); } Al depurar con lldb, sé con certeza que src y dst en copia son punteros válidos. Y, sin embargo, cuando se ejecuta *dst = *src , mi programa arroja un BAD_ACCESS_ERR. Como es esto posible? El compilador debe asignar estáticamente la memoria para src y dst. Ambos son del mismo tamaño en términos de longitudes de cuerda. El error ni siquiera se lanza en el carácter de terminación nula, se lanza la primera vez que se ejecuta la declaración de asignación. ¿Qué no estoy viendo? ¿Esto es específico de macOS?
char* dst = "AAAAAAAAAAAA"; Usted define el destino para apuntar a una sección de la memoria que podría ser de solo lectura: el estándar C permite que los literales de cadena se mantengan en un segmento de solo lectura. 6.4.5p6 String literals :
Debe definir el destino en un montón o en un vector, que esté seguro de asignar correctamente.
dst = malloc(SIZE);o
char dst[100];En el primer caso asegúrate de llamar gratis, en el segundo caso asegúrate de no acceder después de su alcance o la fuente no tiene más de 99 caracteres+NUL.