1

この機能に問題があります。この関数は、必要に応じて配列「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.
 }
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()ポインタを返すことがよくあります。これは、メモリ ブロックを移動する必要があるときに行う必要があります。

この問題を解決するには、この関数からポインタを返すか、関数内のどこでもmusica を渡してMusica***使用する必要があります。*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 に答える