我的这个功能有问题。 此函数在需要时重新分配数组'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.
}
答案 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 );
这可能会导致其他地方出现问题。