paulo1205
(usa Ubuntu)
Enviado em 21/10/2016 - 19:25h
letsdelfino escreveu:
Oi, pessoal. Eu sou nova aqui e estou começando a usar o linux e a aprender algumas linguagens de programação.
Estou com um problema em C e estou usando o Kali.
Tenho que fazer uma lista e preciso salvar uma string usando um ponteiro, mas quando o programa começa a executar ele diz que há uma Falha de Segmentação. Segue o código abaixo.
typedef struct estru{
struct estru *anterior;
char string[100];
O nome “
string ” pode não ser muito bom. Primeiramente porque não dá nenhuma noção de propósito a quem lê o código. Além disso, é um nome muito comumente usado com macro ou como
typedef para supostamente simplificar o uso de strings em geral.
O C++ declara uma classe com esse nome para ter uma representação conveniente de strings. No caso de C++, a chance de conflito de nome seria mais baixa (até porque o nome é
std::string ), mas pode confundir um leitor humano.
struct estru *abaixo;
struct estru *proximo;
}cliente;
cliente *primeiro = NULL;
cliente *p, *q;
Os nomes de variáveis talvez pudessem ser melhores.
Se você usar esses ponteiros como meras variáveis temporárias, então possivelmente deveria declará-los como variáveis locais no bloco em que eles forem usados, não como globais.
void cadastrar(){
p = (cliente*)malloc(sizeof(cliente));
Em C, essa conversão de tipo é desnecessária. Sendo desnecessária, o melhor que você faz é evitá-la.
Eu sempre recomendo que a alocação em C seja feita do seguinte modo:
/* Para um dado só. */
ptr=malloc(sizeof *ptr); // A não ser que o tipo de ‘ptr’ seja ‘void *’.
/* Para um array dinâmico com vários elementos */
dyn_array=malloc(n_elementos * sizeof dyn_array[0]);
printf("Nome:\t");
scanf("%s;", p->string);
Nada errado aqui, mas lembre-se de que lendo desse modo, você não vai poder colocar espaços na string. Além disso, o byte que termina a string (qualquer espaço, incluindo o
'\n' ) vai permanecer no buffer de leitura até a próxima operação.
No entanto, a prudência recomenda que você teste o valor de retorno de
scanf ().
if(primeiro == NULL){
primeiro = p;
Não seria melhor definir
p->anterior ,
p->proximo e
p->abaixo ?
Você está tentando modificar um dado dentro de um objeto apontado por
q , mas qual o valor de
q nesse momento? Grandes chances de você ter o valor
NULL .
p->anterior = q;
}
q->abaixo = NULL;
Aqui, com certeza
q vale
NULL , ao menos na primeira inclusão.
q = p;
primeiro->anterior = p;
p->proximo = primeiro;
}
main(){
A declaração de
main deve explicitamente informar o tipo de retorno como
int . Quando à lista de argumentos da função, você deve dizer se o seu programa vai trabalhar sem argumentos passados pelo sistema ou se quer receber argumentos passados na forma de um vetor de strings.
No primeiro caso, a declaração deve ter a forma “
int main(void) ” Se for a segunda opção, a função terá dois argumentos: o primeiro que é do tipo
int e indica a quantidade de elementos no vetor de strings, e o segundo que é o vetor de strings. A forma da declaração da função, nesse caso, deve ser “
int main(int argc, char **argv) ” (os nomes
argc e
argv são convencionais, você pode optar por outros, desde que mantenha os tipos de cada um).