• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

x3minater

string dinamica

6 mensagens neste tópico

Boas,

tenho a seguinte duvida: como e k fazemos para criar uma string dinamica?

eu tava a tentar fazer assim:

typedef struct{
char *nome;
int numero;
} ALUNO;

...

char nome[50];
ALUNO al;

scanf("%s",nome);
al.nome =  (char*) calloc(strlen(nome), sizeof(char));
	al.nome = nome;

mas n me ta a guardar nada em al.nome  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* ... */
    scanf("%s",nome);                   /* cuidado com buffer overflow!   */
    al.nome = malloc(strlen(nome) + 1); /* espaco para o "NUL terminator" */
    if (al.nome == NULL) {
      /* erro: neste exemplo o programa é abortado */
      fprintf(stderr, "No memory. Program aborted.\n");
      exit(EXIT_FAILURE);
    }
    strcpy(al.nome, nome);      /* <=== */
    /* usa `al.nome` */
    free(al.nome);
/* ... */

No teu código, a instrução "al.nome = nome;" gerava-te um "memory leak".

Antes desta instrução tens um calloc() que, se funcionasse (não testas o resultado), mete um endereço de memória em al.nome. Logo a seguir substituis esse endereço de memória pelo endereço do primeiro elemento do array `nome`. Nunca mais consegues aceder à memória devolvida pelo calloc()!

Substituí o calloc() por malloc() para não "gastar tempo" a meter 0's em `al.nome` já que a instrução imediatamente a seguir vai escrever em `al.nome`.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois...tava-me a esquecer desse strcpy() tmb  :)

Mas n tens de multiplicar por sizeof(char) aqui: malloc((strlen(nome) + 1)*sizeof(char))... e k ja vi um exemplo assim, mas n precebi muito bem pk  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sizeof(char) é, por definição, 1 (um).

Qualquer coisa a multiplicar por 1, é essa qualquer coisa :)

Se queres mesmo multiplicar, então multiplica pelo sizeof de cada elemento.

Assim, se mudares o tipo de elemento não precisas de mudar a instrução com o malloc() (ou calloc). Mas para strings (char *) não vejo a necessidade de introduzir isto.

Exemplo:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int *arr;
  arr = malloc(100 * sizeof *arr);
  if (!arr) {
    fprintf(stderr, "No memory. Program aborted.\n");
    exit(EXIT_FAILURE);
  }
  /* use arr */
  free(arr);
  return 0;
}

Se, daqui a uns dias eu afinal quiser mudar o arr para um array de doubles, não preciso de mudar o malloc:

/*...*/
double *arr;
arr = malloc(100 * sizeof *arr); /* exactamente igual a linha do exemplo anterior */
/*...*/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso já ultrapassa o âmbito do meu trabalho :D mas é sempre bom saber. Thanks :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se a string inicial nao for suficientemente grande nao tens maneira de evitar o seg fault. melhor coisa e fazer listas de chars

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora