2012-01-04 16 views
86

Duplicar posible:
Memory Allocation char* and char[]cómo declarar cadenas en C

Puede alguien explicar lo que es una diferencia entre estas líneas de código

char *p = "String"; 
char p2[] = "String"; 
char p3[7] = "String"; 

en qué caso ¿Debo usar cada uno de los anteriores?

+26

Bueno, eso último es un desbordamiento de búfer, así que es agradable. – Dan

+3

Su tercer ejemplo debe ser 'p3 [6]': debe tener en cuenta el 0 – fge

+18

final @fge: necesita 7, de hecho. – Mat

Respuesta

34

This link debe satisfacer su curiosidad.

Básicamente (olvidando su tercer ejemplo que es malo), el diferente entre 1 y 2 es que 1 asigna espacio para un puntero a la matriz.

Pero en el código, puede manipularlos como punteros de todos modos - lo único, no puede reasignar el segundo.

20

No debe usar la tercera porque es incorrecta. "Cadena" toma 7 bytes, no 5.

El primero es un puntero (se puede reasignar a una dirección diferente), los otros dos se declaran como matrices y no se pueden reasignar a diferentes ubicaciones de memoria (pero su contenido puede cambiar, use const para evitar eso).

+5

'char p3 [5] =" String ";' mientras que peligroso no está mal y es válido en C (pero no en C++) – ouah

+5

@ouah - está mal. Puede pasar la compilación, pero sin embargo ** está mal **. – littleadv

+4

esta es una definición estrictamente conforme para un objeto. Un programa estrictamente conforme no es "incorrecto" en términos de C. – ouah

7
char *p = "String"; means pointer to a string type variable. 

char p3[5] = "String"; significa que está predefiniendo el tamaño de la matriz para que no contenga más de 5 elementos. Tenga en cuenta que, para las cadenas de la hipótesis nula "\ 0" también se considera como un element.So, esta declaración daría un error ya que el número de elementos es de 7 por lo que debe ser:

char p3[7]= "String"; 
27

cadenas en C están representados como matrices de caracteres.

char *p = "String"; 

Usted está declarando un puntero que apunta a una cadena almacenada en algún lugar en su programa (modificación de esta cadena es un comportamiento indefinido) de acuerdo con el lenguaje de programación C 2 ed.

char p2[] = "String"; 

Usted está declarando una matriz de char inicializado con la cadena "Cadena", dejando al compilador el trabajo para contar el tamaño de la matriz.

char p3[5] = "String"; 

Usted declara una matriz de tamaño 5 y la inicializa con "Cadena". Este es un error porque "Cadena" no encaja en 5 elementos.

char p3[7] = "String"; es la declaración correcta ('\ 0' es el carácter de terminación en c cadenas).

http://c-faq.com/~scs/cclass/notes/sx8.html

+0

Solo una nota de que el enlace se ha actualizado a http://c-faq.com/charstring/index.html –