Hỏi về lỗi #define bị giới hạn?

Chương trình của em đang ổn, cho tới khi em thêm 1 marco #define MAXSTRING 1000 thì chương trình đứng luôn. Sau 2 tiếng mày mò bứt tóc trong tuyệt vọng, em đã tìm ra vấn đề đó là phải giảm giá trị của những marco còn lại xuống hoặc phải xóa bớt biến trong structure . Cho em hỏi chuyện này rốt cuộc là sao ạ. Đây là 1 phần từ bài của e.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>

#define MAXSTD 100
#define MAXEMP 1000
#define MAXSDRINK 1000 
#define MAXSTRING 500 

typedef struct student_information
{
    char        full_name[MAXSTRING];
    char        MSSV[MAXSTRING];
    double      workshop[4];
    double      quiz[4];
}std;

typedef struct employee_information
{
    char        full_name[MAXSTRING];
    char        code[MAXSTRING];
    double      salary;
    double      allowance;
}emp;

typedef struct softDrink_information
{
    char        name[MAXSTRING];
    char        make[MAXSTRING];
    long long   volume;
    double      price;
    long long   duration;
}sdrink;

void main(int argc, char**argv)
{
    std     student[MAXSTD];
    emp     employee[MAXEMP];
    sdrink  soft_drink[MAXSDRINK];
    int     count_1 = 0, count_2 = 0, count_3 = 0;
    int     check = 0, select = 0;
    char    enter;
    
    printf("Check error\n");
    getchar();
}

Trong ví dụ này tổng các marco đó mà lớn hơn 2431 là nó sẽ lỗi ngay, chả lẽ tiền xử lý nó có giới hạn bộ nhớ?
Em đang dùng netbean8.2 ạ

Không. Macro không hề có giới hạn. Thứ có giới hạn chính là bộ nhớ mà bạn muốn sử dụng đã vượt quá giới hạn cho phép.
Cụ thể với khai báo MAXSTRING=500. Tính sơ về lượng bộ nhớ một cách gần đúng lượng mem trên stack bạn cần khoảng hơn 2M
với khai báo MAXSTRING=1000 thì lượng bộ nhớ bạn cần lên đến hơn 4M stack, nhiều khả năng là vượt quá bộ nhớ stack tối đa mà bạn có thể sử dụng nên gây lỗi. Với những bài như thế này bạn cần sử dụng con trỏ

7 Likes

Khi khai báo một biến local với kiểu dữ liệu tự định nghĩa hoặc mảng, các bạn nên tuân thủ theo một số rule liên quan đến size của biến. Vì biến local được khởi tạo trên stack(vùng nhớ giới hạn). Với những biến cần kích thước lớn, các bạn có thể cấp phát động (nhớ giải phóng đi sau khi dùng xong), hoặc biến static

3 Likes

MAXSTRING 100 là nhiều rồi bạn :smiley: mô tả thì ko nên fix mà dùng như varchar.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?