No estoy seguro de qué habrá en la matriz de caracteres después de la inicialización de las siguientes maneras.
1.char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Para el caso 2, creo que buf[0]
debería ser ' '
, buf[1]
debería ser '\0'
y de buf[2]
a buf[9]
será contenido aleatorio. Para el caso 3, creo que buf[0]
debería ser 'a'
,buf[1]
debería ser '\ 0', y de buf[2]
a buf[9]
será contenido aleatorio.
¿Es eso correcto?
Y para el caso 1, ¿qué habrá en el buf
? buf[0] == '\0'
y de buf[1]
a buf[9]
habrá contenido aleatorio?
char buf[10]; buf = "a";
no se compila. - Inténtelo primero y luego copie / pegue su código real en la pregunta. Eso le ahorra mucho trabajo a usted y a todos los lectores de su pregunta.Respuestas:
No es así como se inicializa una matriz, sino para:
La primera declaración:
es equivalente a
La segunda declaración:
es equivalente a
La tercera declaración:
es equivalente a
Como puede ver, no hay contenido aleatorio: si hay menos inicializadores, el resto de la matriz se inicializa con
0
. Este es el caso incluso si la matriz se declara dentro de una función.fuente
char
.0
y'\0
tienen el mismo valor.char buff[3] = "abcdefghijkl";
no es válido.char p3[5] = "String";
también es inválido.char p[6] = "String";
es válido y es el mismo quechar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Editar: OP (o un editor) cambió silenciosamente algunas de las comillas simples en la pregunta original a comillas dobles en algún momento después de que proporcioné esta respuesta.
Su código resultará en errores del compilador. Tu primer fragmento de código:
es doblemente ilegal. Primero, en C, no existe un vacío
char
. Puede usar comillas dobles para designar una cadena vacía, como con:Eso le dará un puntero a una
NUL
cadena, es decir, una cadena de un solo carácter con solo elNUL
carácter en ella. Pero no puede usar comillas simples sin nada dentro, eso no está definido. Si necesita designar elNUL
personaje, debe especificarlo:La barra invertida es necesaria para eliminar la ambigüedad del personaje
'0'
.logra lo mismo, pero creo que el primero es un poco menos ambiguo de leer.
En segundo lugar, no puede inicializar matrices después de haberlas definido.
declara y define la matriz. El identificador de la matriz
buf
es ahora una dirección en la memoria y no puede cambiar losbuf
puntos a través de la asignación. Entonceses ilegal. Su segundo y tercer fragmento de código son ilegales por este motivo.
Para inicializar una matriz, debes hacerlo en el momento de la definición:
le dará una serie de 10 caracteres con el primer carácter de ser el espacio
'\040'
y el ser de descansoNUL
, es decir,'\0'
. Cuando una matriz se declara y define con un inicializador, los elementos de la matriz (si los hay) más allá de los que tienen valores iniciales especificados se rellenan automáticamente con0
. No habrá ningún "contenido aleatorio".Si declara y define la matriz pero no la inicializa, como se muestra a continuación:
tendrás contenido aleatorio en todos los elementos.
fuente
Estos son equivalentes
Estos son equivalentes
Estos son equivalentes
fuente
La parte relevante del borrador del estándar C11 n1570 6.7.9 inicialización dice:
y
Por lo tanto, se agrega el '\ 0', si hay suficiente espacio , y los caracteres restantes se inicializan con el valor que
static char c;
se inicializaría dentro de una función.Finalmente,
Por lo tanto, al
char
ser de tipo aritmético, también se garantiza que el resto de la matriz se inicializará con ceros.fuente
Curiosamente, es posible inicializar matrices de cualquier forma en cualquier momento en el programa, siempre que sean miembros de
struct
ounion
.Programa de ejemplo:
fuente
No estoy seguro, pero normalmente inicializo una matriz en "", en ese caso no necesito preocuparme por el final nulo de la cadena.
fuente
main()
(y también debe usarvoid
, es decirint main(void) { ... }
,. C99 eliminó esta regla, por lo que este código no se compilará para C99 y posteriores. La otra cosa a tener en cuenta aquí es que comenzar con C99, si omitereturn
en main, hay unareturn 0;
posición / implícita automática antes}
del final de at main. Estás haciendo uso de la regla int implícita que solo funciona antes de C99, pero estás haciendo uso de la implícitareturn
que solo funciona con C99 y posteriores ; estos dos son obviamente contradictorios .