Pregunta

Estoy tratando de hacer un poco de desarrollo C clásico en Visual C ++ 2008 que modificará los caracteres de una cadena de este modo:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

Me estoy poniendo una excepción no controlada cuando trato de cambiar un carácter. Parece como si pudiera hacer esto en Visual Studio 6 o utilizando gcc, pero tal vez sólo estoy olvidando algo. ¿Tiene Visual Studio alguna manera pasar char * por valor (gestión de memoria). Si es así, ¿cómo desactivar esta opción?

¿Fue útil?

Solución

Probablemente se esté pasando un literal de cadena en alguna parte:

ModifyString("oops");  // ERROR!

C y C ++ le permiten convierte implícitamente a partir de los literales de cadena (que tienen el tipo const char[]) a char*, pero tal uso está en desuso. Las constantes de cadena se les permite ser asignado en memoria de sólo lectura (y por lo general son), por lo que si se intenta modificarlos, obtendrá una violación de acceso (también conocido como fallo de segmentación o error de bus). Si el compilador no pone constantes de cadena en la memoria de sólo lectura, el programa seguirá funcionando, pero es un comportamiento indefinido.

La forma correcta de hacerlo es copiar la cadena en un buffer se puede escribir:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

Otros consejos

¿Es la entrada de una cadena literal? Eso es probablemente el problema. De lo contrario tendrá que publicar más código, como el puntero de alguna manera ha terminado apuntando a una ubicación de sólo lectura en la memoria.

Es imposible responder a esta pregunta sin ver cómo se llama ModifyString. La función en sí es correcto asumiendo que es el contrato se va a pasar un valor no nulo.

Sin embargo, es posible que el sitio de llamada a fallar al hacer cualquier cantidad de cosas

  • Pasar NULL
  • Pasando const char por medio de un molde mal

No puedo decir exactamente por qué esto no funciona, pero el problema es en su código, no Visual Studio. Por alguna razón, usted está pasando un puntero no válido a la función. O bien es un puntero nulo, o que apunta a alguna dirección que no tiene acceso de lectura a.

Si después de poco más de un código (donde es la función llamada, y cómo se llama?), Que puede ser capaz de señalar el problema exacto.

La razón por la que trabajó en GCC o VC6 es, sencillamente, que es un comportamiento indefinido. El estándar de C ++ no dice que "esto debería funcionar", o "esto debe causar un accidente". Cualquier cosa puede suceder si se escribe a la memoria que no tiene acceso a. Y dependiendo del compilador, y el sistema se está ejecutando la aplicación en, la dirección se termina Acceso variará. Por pura suerte, se golpea una dirección que causó una violación de acceso cuando se compila con VC2008. Bajo CCG y VC6, no tuvieron la misma suerte, y tiene código que pareció funcionar , y simplemente escribió en cierta dirección de basura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top