1

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

 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.
 }
4

3 回答 3

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);
于 2010-11-01T16:18:45.943 回答
1

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

如您所知,realloc()通常会返回与传递给它的指针不同的指针。当它需要移动内存块时,它需要这样做。

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

于 2010-11-01T16:27:43.553 回答
0

您可能不会得到一个以 null 结尾的字符串:

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

这可能会在其他地方引起问题。

于 2010-11-01T16:16:49.190 回答