mslomp
(usa Slackware)
Enviado em 05/10/2008 - 12:21h
quanto ao cast, o problema é o seguinte. como disse o colega aí em cima, o c99 define uma extensão para o tratamento dos void* para C, mas isso não está presente no C++. como seu código está meio "híbrido", misturando C e C++ e precisa ser compilado como C++, vai receber um erro de conversão inválida. aí nesse caso, a menos que você ajeite o código para C, vai precisar desse cast.
quando você faz:
char palavra[30];
está criando estaticamente uma variável não inicializada de tamanho 30*sizeof(char), e o linker a colocará em .bss, que é um dos segmentos de dados do seu executável (elf nesse caso). então você acessa o seu ponteiro através de &palavra.
quando faz:
char* palavra = new char[30];
está criando a variável dinamicamente do mesmo modo que malloc faz, apenas usando uma abordagem diferente.
o linker colocará uma dword (usualmente 4 bytes) em .bss, que apenas conterá o endereço para o conteúdo de palavra e reservará 30 bytes na heap para o esse conteúdo.
a partir daí, quando você tenta, por exemplo, copiar o conteúdo de uma string para palavra, deve cuidar para não acabar copiando-a para aquela dword que citei acima, mas sim para o local para onde essa dword aponta.
e nesse caso, ao usar strcpy e derivados, acabará acontecendo essa tragédia.
diferença entre strcpy e *p=*q:
strcpy realiza uma operação byte a byte através dos endereços das cadeias de caracteres. algo mais ou menos assim:
aponta para o início (endereço) da 1a string;
aponta para o início (endereço) da 2a string;
copia 1 byte (conteúdo) da fonte para o destino;
incrementa o índice de ambas;
verifica se é o caractere nulo (\ 0);
se sim, o copia e retorna;
se não, copia o conteúdo;
incrementa os índices;
...
e assim vai, em loop.
quando você faz *p, está fazendo uma derreferência. a grosso modo, é como se trabalhasse com uma variável "normal", como char p, e não um ponteiro. sendo assim, *p = *q atribui ao conteúdo de p o conteúdo de q.
para *p = *q, sendo ambos uma cadeia de caracteres e sabendo-se que q tem tamanho 30, desconsiderando o alinhamento para fins práticos, serão copiados os 30 bytes (ou menos, caso haja um \ 0 no meio do caminho) do conteúdo de q para p, a partir da base de p. internamente isso também envolve os endereços das variáveis, mas há o cuidado de não se cruzar a fronteira (já que envolvem segmentos diferentes) de modo ilegal, tratando do conteúdo e não de seus endereços em si, que só entraram em jogo para localizá-las.
numa analogia boba, é como chegar do méxico para os eua através da alfândega ou do deserto. pela alfângdega, desde que esteja tudo ok, você entra. se for pelo deserto e te pegarem, por mais que não esteja mal intencionado, com certeza a polícia te dará um "segmentation fault".