0
#include<stdlib.h>
#include<stdio.h>

/*

Content of Text FILE

5        // no_of_process   
4        // no_of_resource_type
6 3 4 2  // vector E matrix
3 0 1 1  // 5x4 matrix
0 1 0 0
1 1 1 0
1 1 0 1
0 0 0 0 

*/


int main()
{
    FILE *file;
    int no_of_process;
    int no_of_resource_type;
    int *vector_E;
    int **C;
    int counter = 1, i, k;
    char unwanted[50];

    file = fopen("file_path\\file.txt", "r");
    if(file == NULL){
        printf("NO SUCH A FILE EXISTS!!!");
        exit(1);
    }


    while(!feof(file))
    {
        if(counter == 1){
            fscanf(file, "%d", &no_of_process);           // The number of process is set
            fscanf(file, "100[^\n]", unwanted);           // put in "unwanted" the un wanted chars untill you get \n 
            counter++;                                    // counter for selecting operation type
            printf("\nProcess: %d", no_of_process);
        }

        else if(counter == 2){
             fscanf(file, "%d", &no_of_resource_type);    // The number of resource type is set
             fscanf(file, "100[^\n]", unwanted);          // put in "unwanted" the un wanted chars untill you get \n 
             counter++;                                   // counter for selecting operation type                                
             printf("\nType: %d\n", no_of_resource_type);
        }

        else if(counter == 3){
             vector_E = (int *)malloc(sizeof(int)*no_of_resource_type);  // Allocating memory for vector_E of size # of resource type

             for(i=0; i<no_of_resource_type; i++){                        // fillling vector_E array 
                 fscanf(file, "%d", &vector_E[i]);
                 printf("%d ", vector_E[i]);
             }                        
             fscanf(file, "100[^\n]", unwanted);                         // put in "unwanted" the un wanted chars untill you get \n
             counter++;                                                  // counter for selecting operation type
             printf("\n");                                                  
        }

        else if(counter == 4){
             C = (int**)malloc(sizeof(int *)*no_of_process);             // Allocating memory for Current Allocation Matrix "part1"


             for(i=0; i<no_of_resource_type; i++)                       // Allocating memory for Current Allocation Matrix "part2"
                 C[i] = (int *)malloc(sizeof(int)*no_of_resource_type);


             for(i=0; i<no_of_process; i++){                             // Filling the Current Allocation Matrix
                 for(k=0; k<no_of_resource_type; k++){
                     fscanf(file, "%d", &C[i][k]);
                     printf("%d ", C[i][k]);
                 }
                 printf("\n");

                 // -------------------------------------------------------------------- ???????????
                // Problem is here !!!!!
                // --------------------------------------------------------------------- ???????????

                 fscanf(file, "100[^\n]", unwanted);                     // put in "unwanted" the un wanted chars untill you get \n

             }
        }
    }


    printf("# of Process: %d\n", no_of_process);
    printf("# of Resource Type: %d\n", no_of_resource_type);

    printf("Vector E\n");
    for(i=0; i<no_of_resource_type; i++)
        printf("%d ", vector_E[i]);

    printf("\nCurrent Allocation Matrix\n");
    for(i=0; i<no_of_process; i++){
        for(k=0; k<no_of_resource_type; k++){
            printf("%d ", C[i][k]);
        }
        printf("\n");
    }


    system("pause");
    return 0;
}

タスクは、txt ファイルから数値を読み取ることです。no_of_process、no_of_resource_type、vector_E 行列の読み込みは問題ありません。この問題は、プログラムが「5x4 マトリックス」の 4 行目を読み取り、「プログラムでアクセス違反 (セグメンテーション違反) が発生しました」というエラーが発生した場合に発生します。問題が発生する行を「問題はここにあります!!!」とマークしました。

誰かがこの問題の理由とそれを解決するために何をすべきかを説明できますか?

4

1 に答える 1

1
         C = (int**)malloc(sizeof(int *)*no_of_process); 
         for(i=0; i<no_of_resource_type; i++) 
             C[i] = (int *)malloc(sizeof(int)*no_of_resource_type);

さて、int ポインターに「no_of_process」の多くのスペースを割り当てますが、for ループでは「no_of_resource_type」行のみを割り当てます。したがって、for ループを次のように変更します。

         for(i=0; i<no_of_process; i++) 
于 2012-05-03T15:05:11.053 に答える