paulo1205
(usa Ubuntu)
Enviado em 15/07/2013 - 06:21h
[/i]O problema é que o que você chamou de
string nada mais é do que um ponteiro para caracteres. Um ponteiro é tão-somente uma variável que armazena um endereço de memória.
Dentro de
main(), quando você declara
arquivo como sendo um array de
_n elementos do tipo que você chamou de
string, você reservou espaço para
_n ponteiros,
mas não reservou espaço para os dados propriamente ditos, que são as strings para os quais tais ponteiros deveriam apontar.
Se funcionou para você quando você rodou na mão, você
deu azar de ter funcionado, pois deveria ter dado o mesmo tipo de erro.
Mas não se deixe abater por essa confusão. Acho que quase todos nós -- eu, com certeza --, ao começar com C, e especialmente depois de passar por outras linguagens que possuem um tipo de dados especialmente definido para trabalhar com strings, ficamos um pouco confusos por causa do modo que parece (mas não é!) intercambiável de usar arrays e ponteiros.
Quando você declara um array
arr com
n elementos do tipo
T (i.e.: uma declaração na forma
T arr[n];), você reserva espaço em memória para cada um dos
n elementos. Cada elemento
arr[i] (desde que 0<=
i<
n) se comporta uma variável independente do tipo
T independente das que estão armazenadas nos demais elementos.
Em particular, e como a qualquer variável comum, o operador unário
& pode ser aplicado a cada elemento
arr[i] do array, para retornar o endereço da memória em que esse elemento reside. Por convenção, quando o nome do array aparece numa expressão sem estar com a qualificação de acesso a um elemento específico, isso é sinônimo de obter o endereço do primeiro elemento do array (i.e.: no nosso caso,
arr é sinônimo de
&arr[0]).
Baseado na minha experiência pessoal quando era iniciante em C, acho que essa notação é uma das princiapais causas de confusão entre arrays e ponteiros, principalmente no caso de arays/ponteiros de caracteres empregados para manipular strings.
(continua)