1

文字列の配列を調べて、その文字列が配列内で何回出現するかを調べる関数があります。見つかった場合、文字列はに設定されNULL、カウンタは文字列が見つかった回数を追跡します。次に、ループ内の別の関数を呼び出して、周波数配列にメモリを割り当て、を格納できるようにしますcount。正常に動作しているように見えますが、メイン内で他の変数を作成すると、プログラムがクラッシュします。これが私の2つの機能です。

int search(char **table, int **frequency, int wordSize)
{
//  Local Declaration
int i, j, k;
int count = 1;
int strCount = 0;
char target[25];

// Statement
for(i = 0, k = 0; i < wordSize; i++)
{
    if(table[i] != NULL)
    {
        strcpy(target, table[i]);
        for(j = i + 1; j < wordSize; j++)
        {
            if(table[j] != NULL &&
               strcmp(target, table[j]) == 0 &&
               target != table[i])
            {
                count++;
                free(table[j]);
                table[j] = NULL;
            }
        }
    strCount += makeFreq(frequency, k, count);
    k++;
    }
    count = 1;
}

return strCount;
}// search


int makeFreq(int **frequency, int k, int count)
{
//  Local Declaration
int strCount = 0;

//  Statement
frequency[k]=(int*)malloc(sizeof(int));
frequency[k][0] = count;
strCount += 1;

return strCount;
}// makeFreq

誰かが私のプログラムがクラッシュする理由を説明できますか?

ここでは、テーブルに1000個のポインターを割り当てました。

char** getPoint(void)
{
//  Local Declaration
char **table;

//  Statement
table = (char**)calloc(MAX_SIZE + 1, sizeof(char));
if(table == NULL)
{
    MEM_ERROR, exit(100);
}

return table;
}// getPoint

私が読んだよりも、ファイル内の文字列にメモリを割り当て、それを文字列の配列に格納します。

int scanFile(char **table, FILE *fpFile)
{
//  Local Declaration
int count = 0;
char temp[500];
char **ptr = table;

//  Statement

//  scan file, allocate, and copy string to array.
while(fscanf(fpFile, "%s", temp) != EOF)
{
    *(ptr + count) =(char*)calloc(strlen(temp)+1, sizeof(char));
    strcpy(*(ptr + count), temp);
    count++;
}

return count;
}// scanFile

これが、周波数配列にポインターの配列を割り当てた方法です。

void aloFreqAry(int **frequency, int wordSize)
{
//  Local Declaration

//  Statement
frequency =(int**)calloc(wordSize + 1, sizeof(int));
if(frequency == NULL)
{
    MEM_ERROR, exit(103);
}

return;
}// aloFreqAry
4

2 に答える 2

3

割り当てのサイズの問題は別として(の割り当てとの割り当てにある必要がありますsizeof(char*))、tablesizeof(int*)frequency

void aloFreqAry(int **frequency, int wordSize)
{
//  Local Declaration

//  Statement
frequency =(int**)calloc(wordSize + 1, sizeof(int));
if(frequency == NULL)
{
    MEM_ERROR, exit(103);
}

return;
}// aloFreqAry

frequency呼び出し元のに何も割り当てません。そのポインタのローカルコピーにメモリを割り当てるだけで、関数が戻るときにそのハンドルを失います。

引数をとる代わりにint**、関数は引数を返す必要があります。

frequency = calloc(wordSize + 1, sizeof(int*)); // size of a _pointer_ to int
if(frequency == NULL)
{
    MEM_ERROR, exit(103);
}

return frequency;

発信者に割り当てます。

于 2013-02-27T22:13:14.200 に答える
1

このステートメントは疑わしいように見えます (「ここで、テーブルに 1000 個のポインターを割り当てました」と言います):

table = (char**)calloc(MAX_SIZE + 1, sizeof(char));

これはポインターの割り当てではなく、char バッファーの割り当てのように見えます。

おそらくあなたは次のことを意味します:

table = (char**)calloc(MAX_SIZE + 1, sizeof(char*));
于 2013-02-27T22:06:40.897 に答える