Nome com 10 caracteres

Nome com 10 caracteres

por Guilherme Costa -
Número de respostas: 9
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?
Em resposta à Guilherme Costa

Re: Nome com 10 caracteres

por Wellington Castello -
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.
Em resposta à Wellington Castello

Re: Nome com 10 caracteres

por Vanessa Sabino -
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.
Em resposta à Vanessa Sabino

Re: Nome com 10 caracteres

por Wellington Castello -
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.
Em resposta à Vanessa Sabino

Re: Nome com 10 caracteres

por Wellington Castello -
Em resposta à Wellington Castello

Re: Nome com 10 caracteres

por Vanessa Sabino -
Ou não piscando

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í! sorriso
Em resposta à Vanessa Sabino

Re: Nome com 10 caracteres

por Wellington Castello -
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.
Em resposta à Wellington Castello

Re: Nome com 10 caracteres

por Vanessa Sabino -
Sim, sou eu. Esta é a foto antiga do Orkut. E em Java esse problema nunca aconteceria! boca aberta
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...
Em resposta à Wellington Castello

Re: Nome com 10 caracteres

por José Augusto Soares -
Dá para fazer uns testes imprimindo valores de endereços. No programa abaixo o endereço de memória de 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>

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;
}
Sáida do programa:
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