Erro meio bizarro

Erro meio bizarro

por Fernando Fernandes Chaves -
Número de respostas: 5
Não sei se alguém consegue me ajudar nessa, ou está tendo o mesmo problema.

Depois que eu guardo uma string de tamanho 12 (nem 11, nem 13, exatamente 12) e só quando eu faço a 1a consulta a essa string depois de tê-la guardado, alguma alma do além insere um caractere '^Q' no final dessa string.

Isso tá ferrando meu programa pois faz com que se criem vários vértices para uma mesma string (na hora de comparar, "minhasdefs.h" != "minhasdefs.h^Q").

De novo: isso só acontece com strings de tamanho 12.

Se alguém tiver alguma idéia de por que isso tá acontecendo, qualquer que seja, ajudaria muito.

Obrigado.
Em resposta à Fernando Fernandes Chaves

Re: Erro meio bizarro

por Marcela Ortega -
Quando vc aloca o vetor, verifique se há espaço pro '\0' do final da string.

Comigo aconteceu a mesma coisa... só não me pergunte pq raios só não funciona pra 12 =D
Em resposta à Fernando Fernandes Chaves

Re: Erro meio bizarro

por Fernando Fernandes Chaves -
Os mallocs estavam ok, só dava pau pra strings de tamanhos 12 (10, 11, 13, 14 funciona direito...).

Mas é isso mesmo, eu mudei a alocação pra algo do tipo:

nome[v] = (char*)malloc((strlen(buff) + 1) * sizeof(char));

E funcionou!

Sei lá, o 12 deve ter algum significado cabalístico em ansi C sorriso

Obrigado, Marcela e Natan.
Em resposta à Fernando Fernandes Chaves

Re: Erro meio bizarro

por Natan Costa Lima -
"Mas é isso mesmo, eu mudei a alocação pra algo do tipo:"
Então os mallocs não estavam ok.. =P

Sempre que acontece erros místicos em C é culpa de acessos errados na memória!
Em resposta à Fernando Fernandes Chaves

Re: Erro meio bizarro

por Rafael Schouery -
O strlen devolve qual o tamanho da palavra, mas não conta o \0, como vc precisa do espaço para o \0 você realmente tem que somar 1.
12 não tem algum significado cabalístico em ansi C além do acesso a uma posição inválida da memória. Pode parecer estranho que com 13 funcione, mas existe uma estrutura por trás.

Note que não há segfault porque você não saiu da memória do programa.