使用C中的realloc函数进行内存分配的问题

时间:2010-11-01 16:08:31

标签: c memory realloc

我的这个功能有问题。 此函数在需要时重新分配数组'music'的大小。 但是当我尝试在循环中多次调用此函数时发生执行错误。 它可能是一个内存分配问题,但我无法弄清楚这一点。

 void adicionar( Musica** music , int* cont){//adiciona uma música à playlist na posição cont.
     int tam;//armazenará o tamanho do nome da música.
     char *str_aux;//receberá temporariamente o nome da música.
     if ((*cont) == 0){//aloca memória para o primeiro ponteiro para Musica.
         music[*cont] = (Musica*) malloc( sizeof (Musica));
         if( music[*cont] == NULL ){
         printf("Erro na alocacao de memoria!\n");
         exit(-1);
         }
     }
     else{//redimensiona o vetor a cada nova adição de música.
         music = (Musica**) realloc( music , ((*cont) + 1) * sizeof( Musica* ));
         music[*cont] = (Musica*) malloc( sizeof (Musica));
         if( music == NULL ){//verifica se o realloc foi bem sucedido.
            printf("Erro na alocacao de memoria!\n");
            exit(-1);
         }
         if( music[*cont] == NULL ){
            printf("Erro na alocacao de memoria!\n");
            exit(-1);
         }
         printf("%0x\n",music);
         printf("%d\n", music[(*cont) - 1]->tempo);
         //printf("%d\n",*cont - 1);
     }
     str_aux = (char*) malloc( 26*sizeof(char));
     printf("Musica: ");
     scanf("%25[^\n]", str_aux);
     fflush(stdin);
     tam = strlen( str_aux );
     printf("Tempo: ");
     scanf("%d", &music[*cont]->tempo);
     music[*cont]->nome = (char*) malloc(tam * sizeof(char));
     if( music[*cont]->nome == NULL ){
         printf("Erro na alocacao de memoria!\n");
         exit(-1);
     }
     strcpy( music[*cont]->nome , str_aux );
     printf("musica adicionada.\n\n");
     free( str_aux );
     (*cont)++;//incrementa cont para que ele aponte para a próxima posição do vetor caso queira adicionar mais músicas.
 }

3 个答案:

答案 0 :(得分:2)

看起来你没有为终止NUL角色分配内存。

目前你在做:

tam = strlen( str_aux );
...
music[*cont]->nome = (char*) malloc(tam * sizeof(char));
...
strcpy( music[*cont]->nome , str_aux );

您需要将内存分配为:

music[*cont]->nome = malloc(tam+1);

答案 1 :(得分:1)

我认为问题在于你将music指针传递给函数,并在函数内部realloc() music所指向的内存,但你永远不会在外面更新音乐指针功能。

如您所知,realloc()通常会返回与传递给它的不同的指针。它需要在需要移动内存块时执行此操作。

要解决此问题,您需要从此函数返回music指针,或者您需要在函数内的任何位置传递Musica***并使用*music

答案 2 :(得分:0)

您可能不会以空终止字符串结束:

music[*cont]->nome = (char*) malloc(tam * sizeof(char));
...
strcpy( music[*cont]->nome , str_aux );

这可能会导致其他地方出现问题。