Nota especial sobre strings de caracteres
Suponha que você crie os seguintes fragmentos de códigos e os execute:
Fragment 1
{
char *s;
s="hello";
printf("%s\n",s);
}
Fragment 2
{
char s[100];
strcpy(s,"hello");
printf("%s\n",s);
}
Estes dois fragmentos produzem o mesmo resultado, porém seu comportamento interno é bastante diferente. No fragmento 2, você não pode dizer s="hello";. Para entender as diferenças, você precisa entender como funciona a tabela de constantes de strings de caracteres em C.
Quando seu programa é compilado, o compilador cria o arquivo objeto que contém seu código de máquina e uma tabela com todas as constantes de strings declaradas no programa. No fragmento 1, a instrução s="hello"; faz com que s aponte para o endereço da string de caracteres hello na tabela de constantes de string. Como esta string está na tabela de constantes de string, tecnicamente parte do código executável, não pode ser modificada. Você só pode apontar para ela e utilizá-la para leitura.
No fragmento 2, a seqüência hello também existe na tabela de constantes, portanto você pode copiá-la na matriz de caracteres denominada s. Visto que s não é um ponteiro, a instrução s="hello"; não funcionará no fragmento 2. Ele sequer compilará.
Nota especial sobre o uso de seqüências de caracteres com malloc
Suponha que você escreveu o seguinte programa:
int main()
{
char *s;
s=(char *) malloc (100);
s="hello";
free(s);
return 0;
}
Ele compila corretamente, mas indica uma falha de segmentação na linha free ao ser executado. A linha malloc aloca um bloco de memória de 100 bytes e aponta s para ele, porém agora a linha s="hello"; é um problema. Ela está sintaticamente correta, pois s é um ponteiro, mas quando s="hello"; é executado, s aponta para a seqüência na tabela de constante de seqüências e o bloco alocado é deixado órfão. Considerando que s está apontando para a tabela de constante de string, a string de caracteres não pode ser alterada e free falha, pois não consegue desalocar um bloco na região executável.
A codificação correta é a seguinte:
int main()
{
char *s;
s=(char *) malloc (100);
strcpy(s,"hello");
free(s);
return 0;
}
|