sexta-feira, 15 de junho de 2007

Strings em C - parte 2

Mais esquisitices de strings...Se ponteiros e matrizes equivalem, porque não funciona a sequencia abaixo:

char nome[50];
nome = "joão";

tá, ele não pode associar um char[50] com um char[5]...tudo bem, mas se usar ponteiros, funciona:

char * nome = new char [50];
nome = "joão";

E tem um componente a mais, já que com ponteiros ficaria mais claro se fosse assim:
*nome++ = 'j';
*nome++ = 'o';
*nome++ = 'a';
*nome++ = 'o';
*nome = '\0';
nome = nome-4;
for (int i=0; i<5; i++) { cout << *nome++ ; }

Bem, problemas para pensar ...

Tchê.

2 comentários:

Juliano Heyse disse...

Para pensar um pouco mais: No primeiro exemplo, se colocar char nome[5] também não funciona. Não tem nada a ver com o número de posições de memória.

Outra coisa: se colocar ponteiros char* nome não precisa de new e nem definir o número de posições de memória. O código ficaria assim:

char* nome;
nome = "joao";

Sinistro...

Valdir Noll disse...

De fato é sinistro. Pra mim parece que se o ponteiro aponta para uma variável do tipo char, então ele aloca espaço somente para 1 char e não para 5, como é o caso. Portanto, ele está avançando na memória sem nenhum tipo de controle. Funciona porque é pouco dado e usa pouca memória, mas se fosse um dado maior, acho que ia dar problema, porque poderia avançar na memória de outros dados. Por isso ainda é um pouco mais seguro definir pelo new char[50], apesar de que não tem nenhum controle sobre o tamanho da string lida...que magavilha !!