返回动态指针数组

时间:2017-11-25 20:53:37

标签: c pointers return double malloc

你好我有这个函数,它有3个动态矩阵,我需要返回每一个,但我不能使用结构,所以我试图在参数上使用三指针,所以我可以存储地址并在其他函数上使用它,问题是当我这样做时程序崩溃..

该函数获取一个数组,该数组在每个指针上包含一个文本(数组)的短语和数量(n_frases),这里的目标是拥有一个没有所有阶段的重复单词的数组(todasPalavras),一个数组重复的单词(palavras_com_repeticao)和单词在文本上的位置(palavra_com_posi)。

就像我之前说过的,我想要返回palavra_com_posi,但它会崩溃,帮助。产品:>

 char **separar_palavras(char **array, int n_frases, int *numero_de_palavras,int *** array_posicao, char** palavras_com_repeticao)
{ 

   printf("%d----------\n",n_frases);
    char *palavra=NULL;
    int numero_de_palavra = 0,numero_da_palavra_frases=0,numero_da_palavra_frases_total=0,npalavrasmax=10,i,c;
    char **todasPalavras=(char**)malloc(sizeof(char *)*10);

    palavras_com_repeticao=(char**)malloc(sizeof(char*)*10);
   int ** palavra_com_posi=(int**)malloc(sizeof(int *)*10);

    for(i=0; i<n_frases; i++)
    {
        palavra = strtok (array[i]," ,.!?\n");
        numero_da_palavra_frases=0;

        while(palavra!=NULL)
        {
            int flag=1;

            //palavra=caracteres_especiais(palavra,strlen(palavra));

            palavras_com_repeticao[numero_da_palavra_frases_total]=(char*)malloc(1*(strlen(palavra)+2));
            strcpy(palavras_com_repeticao[numero_da_palavra_frases_total],palavra);
            palavras_com_repeticao[numero_da_palavra_frases_total][strlen(palavra)]='\0';

            //   printf("%s\n",palavras_com_repeticao[numero_da_palavra_frases_total]);


            palavra_com_posi[numero_da_palavra_frases_total] = malloc(4 * sizeof(int));
            palavra_com_posi[numero_da_palavra_frases_total][0]  = i+1;
            palavra_com_posi[numero_da_palavra_frases_total][1]=numero_da_palavra_frases+1;
            palavra_com_posi[numero_da_palavra_frases_total][2]=numero_da_palavra_frases_total+1;
            palavra_com_posi[numero_da_palavra_frases_total][3]=0;


            numero_da_palavra_frases++;
            numero_da_palavra_frases_total++;


               if(numero_da_palavra_frases_total%10==0 && numero_da_palavra_frases_total!=0)
                  {

                      palavra_com_posi = realloc(palavra_com_posi,((numero_da_palavra_frases_total+10)*sizeof(int*)));
                      palavras_com_repeticao = realloc(palavras_com_repeticao,((numero_da_palavra_frases_total+10)*sizeof(char*)));
                      int o=0;
                       for(o=numero_da_palavra_frases_total;o<numero_da_palavra_frases_total+10;o++)
                      {
                                    palavra_com_posi[o]=NULL;
                                    palavras_com_repeticao[o]=NULL;

                      }

                      // *(todasPalavras+numero_de_palavra)=(char**)malloc(sizeof(char *)*10);//-----A dar mal-----
                  }



            for(c=0; c<numero_de_palavra; c++)
            {
                if(strcmp(palavra,todasPalavras[c])==0)
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1)
            {
                todasPalavras[numero_de_palavra]=(char*)malloc(sizeof(char)*(strlen(palavra)+1));

                strcpy(todasPalavras[numero_de_palavra],palavra);
                todasPalavras[numero_de_palavra][strlen(palavra)] = '\0';


                //printf("%d\n",strlen(palavra));
                numero_de_palavra++;
                if(numero_de_palavra==npalavrasmax)
                {
                    npalavrasmax += 10;
                    todasPalavras = realloc(todasPalavras,(npalavrasmax*sizeof(char*)));
                    int h=0;
                    for(h=numero_de_palavra;h<npalavrasmax;h++)
                    {
                        todasPalavras[h]=NULL;

                    }
                    // *(todasPalavras+numero_de_palavra)=(char**)malloc(sizeof(char *)*10);//-----A dar mal-----
                }
            }

            palavra = strtok(NULL, " ,.!?\n");
        }

    }

    *numero_de_palavras=numero_de_palavra;

        //search_word(palavra_com_posi,numero_da_palavra_frases_total,palavras_com_repeticao);
        //frase_entre_palavras(palavra_com_posi,numero_da_palavra_frases_total,palavras_com_repeticao); //-bug
        //frase_entre_palavras_escolhidas(palavra_com_posi,numero_da_palavra_frases_total,palavras_com_repeticao); //-bug
        //search_letras(palavras_com_repeticao, numero_da_palavra_frases_total);
        //primeira_ultima_letra(palavras_com_repeticao,numero_da_palavra_frases_total);
        //palavra_media(palavras_com_repeticao,numero_da_palavra_frases_total);
        //maior_tamanho(palavras_com_repeticao,numero_da_palavra_frases_total);
        //procurar_raizes(palavras_com_repeticao,numero_da_palavra_frases_total);

    *array_posicao=palavra_com_posi;  //----->Crashes here

    return todasPalavras;
} 

void example()
{
   // printf("\n\n %c %c",'a',tolower('A'));
    int i = 0, j = 0, n = 4, numero_frases=0, pi=0;
    char *texto = NULL;
    int  numero_de_palavras= 0;
    char *path = "data\\message_1.txt";
    char **array_frases=NULL;
    char **bag_of_words=NULL;
    char **todas_palavras=NULL;
    int ***array_posicao_palavras=NULL;

    texto= read_message(path);
   // printf("%s",texto);


  array_frases=create_array_strings(texto,&numero_frases);

  bag_of_words=separar_palavras(array_frases,numero_frases,&numero_de_palavras,array_posicao_palavras,todas_palavras);

0 个答案:

没有答案
相关问题