1
/* 
INCLUDES & DEFINES
*/
#define _CRT_SECURE_NO_WARNINGS 1

#include "stdlib.h"
#include "stdio.h"
#include "string.h"

#define N 10

#define LINE_LENGTH (65537*6) /* assuming we deal with integers. 65536 is the largest integer. each number in line offers a ' ' or '\0' and each number consists of 5 chars max.*/
#define STR_MAIN_ERROR_MSG "error occured while attempting to read data from file. aborted!\n"
#define STR_MENU "(a) print double-dynamic array.\n(b) add new number.\n(c) add new column.\n(d) remove last number.\n(e) remove last column.\n(q) quit program.\n\nEnter your choice: "
#define STR_MENU_INPUT_ERROR "Wrong Choice, try again.\n"
#define STR_MENU_QUIT "End of program, Thank you & good bye...\n"
#define STR_MENU_SHORT "Menu: ...\nEnter your choice: "
/*
FUNCTION DECLARATIONS
*/
int allocate_subarray(int**, const int);
int parse_line_data(char*,int**,const int);
int read_file_successful(int**);
void start_menu(int**);
void terminate(int**);

void funcA(const int**);
void funcB(int**);
void funcC(int**);
void funcD(int**);
void funcE(int**);
/*
MAIN FUNCTION BODY
*/
int main(){
    int *Array[N]={NULL};
    if ( read_file_successful(Array)) start_menu(Array);
    else printf("%s",STR_MAIN_ERROR_MSG);
    return 0;
}
/*
OTHER FUNCTION BODIES
*/
int allocate_subarray(int** p, const int size){
    *p=(int*)malloc(sizeof(int)*size);
    return (p!=NULL);
}
int parse_line_data(char *S, int **A, const int i){
    int j;
    int size=atoi(strtok(S," "));
    if(!allocate_subarray(&A[i], size)) return 0;
    for(j=0; j<size; j++) A[i][j]=atoi(strtok(NULL," "));
    return 1;
}
int read_file_successful(int** A){   /* <----- STACK OVERFLOW HAPPENS HERE. */
    FILE *f=fopen("input3.txt", "r");
    if(f){
        char line[LINE_LENGTH*N];
        int i;
        for(i=0; fgets(line,sizeof(line),f) && i<N; i++) 
            if (!(parse_line_data(line, A, i))) return 0;
        fclose(f);
        return 1;
    }
    return 0;
}
void start_menu(int **A){
    char choice;
    printf("%s",STR_MENU);
    do{
        scanf("%c",&choice);
        while(getchar()!='\n');
        switch(choice){
            case 'q': terminate(A); printf("%s",STR_MENU_QUIT); return;
            case 'a': funcA(A); break;
            case 'b': funcB(A); break;
            case 'c': funcC(A); break;
            case 'd': funcD(A); break;
            case 'e': funcE(A); break;
            default: printf("%s",STR_MENU_INPUT_ERROR);
        }
    } while(printf("%s",STR_MENU_SHORT));
}
void terminate(int **A){
    int i;
    for(i=0; i<N && A[i]; i++) free(A[i]);
}
/**/
void funcA(const int **A){}
void funcB(int **A){}
void funcC(int **A){}
void funcD(int **A){}
void funcE(int **A){}

テキストファイルから行を読み取り、それらをmallocに割り当てられた配列に格納された整数に変換する基本的なプログラムである友人のためにこの好意を示しています(サイズもテキストで指定されています)。問題は、長い間 C. がこの美しさをデバッグしていないことです。コメントした場所にスタック オーバーフロー エラー メッセージが表示されます。関数パラメーターのさまざまなバリエーションを試しました: int* A[] 、 int* A[N] .. それでも @run-time でつまずきます。

4

1 に答える 1

3

に N * LINE_LENGTH スタック スペースを割り当てていますread_file_successful()。計算する。それは 10 * 65537 * 6、つまり 3932220 バイトです。したがって、スタックを吹き飛ばします。

char line[LINE_LENGTH*N];

LINE_LENGTH は 65537*6 で、N は 10 です。

于 2012-11-27T00:29:40.090 に答える