Eu declaro um vetor de tamanho 10 para guardar o nome do conjunto, o usuário coloca um nome de 10 caracteres. Pergunta: é necessário declarar um vetor de tamanho maior do que 10 para armazenar o caractere "\0", que marca o final da string?
Sim! Você precisa alocar ou declarar um vetor de pelo menos 11 caracteres.
char foo[10] armazena 11 caracteres, não precisa declarar um char bar[11] porque armazenaria 12.
char foo[10] é suficiente para uma string de 10 caracteres, com \0.
char foo[10] é suficiente para uma string de 10 caracteres, com \0.
Na verdade precisa ser 11 sim. Pode até ser que funcione com 10, mas seria pura sorte do espaço de memória após o décimo caracter não estar sendo usado para alguma outra coisa.
Na verdade sao 11 mesmo, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 = 11 caracteres). De legal[0] a legal[9] sao 10 caracteres, o caractere do legal[10] nesse caso ficaria reservado para o delimitador da string (que seria o '\0'). A partir do legal[11], supondo que foi declarado como legal[10] (que funcionaria corretamente), ai sim invocaria undefined behaviour.
Ou não?
Ou não 
Se você declara legal[10] você pode usar de legal[0] a legal[9].
A partir daí, a sorte está lançada!
E para os alunos que eu for corrigir o EP, já aviso que o Murphy deve ter sido um dos desenvolvedores do meu sistema operacional, porque aqui se pode dar erro, não tenha dúvidas de que vai dar!
Na correção do EP1 mesmo eu peguei um caso de um vetor que havia sido declarado de tamanho 4 e tentaram acessar de 1 a 4 ao invés de 0 a 3, aí na hora de chamar o CriaImagem ele estava sobrescrevendo justamente a área de memória do índice 4, enquanto em outro sistema operacional funcionou normalmente.
Não é porque o C permite que você acesse memória que não deveria que você vai sair fazendo isso por aí!
Se você declara legal[10] você pode usar de legal[0] a legal[9].
A partir daí, a sorte está lançada!
E para os alunos que eu for corrigir o EP, já aviso que o Murphy deve ter sido um dos desenvolvedores do meu sistema operacional, porque aqui se pode dar erro, não tenha dúvidas de que vai dar!
Na correção do EP1 mesmo eu peguei um caso de um vetor que havia sido declarado de tamanho 4 e tentaram acessar de 1 a 4 ao invés de 0 a 3, aí na hora de chamar o CriaImagem ele estava sobrescrevendo justamente a área de memória do índice 4, enquanto em outro sistema operacional funcionou normalmente.
Não é porque o C permite que você acesse memória que não deveria que você vai sair fazendo isso por aí!
Sim, eu sei que os índices em C começam do 0. A única confusão foi pensar que o legal[10] declarava 11 espaços, contando a partir de 0, mas o ISO C proíbe zero-size array, o que eu não sabia até ontém.
Mas de fato, na página 24 do K&R está todo o comentário sobre os índices.
Ok, não vou entregar programa com memory leak.
A propósito, você não é a bani? Linux chix, Java, etc. Acabei de lembrar o seu nome, reconheci a foto, mas na que tem aqui você está com a camiseta preta Linux chix. Sou o nerdwell lá da Freenode. Quando é que você se tornou monitora de mac122?
Até mais.
Mas de fato, na página 24 do K&R está todo o comentário sobre os índices.
Ok, não vou entregar programa com memory leak.
A propósito, você não é a bani? Linux chix, Java, etc. Acabei de lembrar o seu nome, reconheci a foto, mas na que tem aqui você está com a camiseta preta Linux chix. Sou o nerdwell lá da Freenode. Quando é que você se tornou monitora de mac122?
Até mais.
Sim, sou eu. Esta é a foto antiga do Orkut. E em Java esse problema nunca aconteceria! 
Eu sou monitora desde que surgiram todos os monitores de MAC desse semestre, porém sou "mais monitora" da turma do Gub, então não serei eu que vou corrigir seus EPs...
Eu sou monitora desde que surgiram todos os monitores de MAC desse semestre, porém sou "mais monitora" da turma do Gub, então não serei eu que vou corrigir seus EPs...
Dá para fazer uns testes imprimindo valores de endereços. No programa abaixo o endereço de memória de
O programa altera o valor de
Zé Augusto
foo[10]
coincide com o endereço de letra
. Note que 10
é índice inválido. O programa altera o valor de
foo[10]
. Como conseqüência, o valor de letra
é alterado.
Zé Augusto
#include <stdio.h>Sáida do programa:
int main()
{
char letra, foo[10];
/*
Imprime os enderecos de memoria
reservados para as variáveis
*/
printf("endereço de letra = %p\n", &letra);
printf("endereço de foo[0] = %p\n", &foo[0]);
printf("endereço de foo[10] = %p\n", &foo[10]);
letra = 'a';
printf("Valor de letra = %c\n", letra);
foo[10] = 'z';
printf("Valor de foo[10] = %c\n", foo[10]); /* 10 é índice inválido */
printf("Valor de letra = %c\n", letra);
return 0;
}
endereço de letra = 0xbf91c783
endereço de foo[0] = 0xbf91c779
endereço de foo[10] = 0xbf91c783
Valor de letra = a
Valor de foo[10] = z
Valor de letra = z