0 👍
162 lượt xem
bởi
Chào mọi người, em đang gặp rắc rối với việc cấp phát bộ nhớ trong C, khi đọc file input thì xuất hiện lỗi Segmentation fault (core dump), mọi người có thể giúp em xem thử đoạn code của em bị lỗi chỗ nào ạ? Em cảm ơn!
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define iniCapacity 100

int cpAsc (const void * x, const void * y)
{
   return ( *(int*)x - *(int*)y );
}

int cpDes (const void * x, const void * y)
{
   return ( *(int*)y - *(int*)x );
}

static struct stage1{
    bool         snail;
    short int    fly;
    int         bat;
    bool         ring;
    short int     head;
    unsigned char     soap;
    short int    brain;
    long int     hands;
    float         stomach;
    double        chairs;
    char        drink[9];
    int         collar;
    double        minister;
    unsigned char     position;
    char        fireman;
    bool        goose;
} stage1;

void add(struct stage1 *arr, int index, struct stage1 value, int *size, int *capacity){
    if(*size > *capacity - sizeof(struct stage1)){
        arr = (struct stage1*)realloc(arr, sizeof(arr) *2);
        *capacity = sizeof(arr) *2;
    }
    *(arr + sizeof(struct stage1)*index) = value;
    *size+=sizeof(struct stage1);
}

int main(int argc, char **argv){
    
    struct stage1 *stage3 = (struct stage1*)malloc(iniCapacity*5);

    int i = 0;
    int size = 0;
    int capacity = iniCapacity*5;
    struct stage1 tempS;
    
    if(argc < 2){
        fprintf(stderr, "no input file!\n");
        exit(1);
    }
    
    FILE *fr,*fw;
    fr = fopen(argv[1],"rb");
    
    while(true){
        
        
        fread(&tempS.snail,sizeof(tempS.snail),1,fr);
        if(feof(fr)){
            break;
        }
        fread(&tempS.fly,sizeof(tempS.fly),1,fr);
        fread(&tempS.bat,sizeof(tempS.bat),1,fr);
        fread(&tempS.ring,sizeof(tempS.ring),1,fr);
        fread(&tempS.head,sizeof(tempS.head),1,fr);
        fread(&tempS.soap,sizeof(tempS.soap),1,fr);
        fread(&tempS.brain,sizeof(tempS.brain),1,fr);
        fread(&tempS.hands,sizeof(tempS.hands),1,fr);
        fread(&tempS.stomach,sizeof(tempS.stomach),1,fr);
        fread(&tempS.chairs,sizeof(tempS.chairs),1,fr);
        fread(&tempS.drink,sizeof(tempS.drink),1,fr);
        fread(&tempS.collar,sizeof(tempS.collar),1,fr);
        fread(&tempS.minister,sizeof(tempS.minister),1,fr);
        fread(&tempS.position,sizeof(tempS.position),1,fr);
        fread(&tempS.fireman,sizeof(tempS.fireman),1,fr);
        fread(&tempS.goose,sizeof(tempS.goose),1,fr);
        
        add(stage3,i,tempS, &size, &capacity);
        
        printf("%d, %d, %d, %d, %d, %d, %d, %lx, %f, %lf, %s, %d, %lf, %d, %c, %d\n",
    (stage3+i*sizeof(struct stage1))->snail, (stage3+i*sizeof(struct stage1))->fly, (stage3+i*sizeof(struct stage1))->bat, (stage3+i*sizeof(struct stage1))->ring, (stage3+i*sizeof(struct stage1))->head, (stage3+i*sizeof(struct stage1))->soap, (stage3+i*sizeof(struct stage1))->brain, (stage3+i*sizeof(struct stage1))->hands,
    (stage3+i*sizeof(struct stage1))->stomach, (stage3+i*sizeof(struct stage1))->chairs, (stage3+i*sizeof(struct stage1))->drink, (stage3+i*sizeof(struct stage1))->collar, (stage3+i*sizeof(struct stage1))->minister, (stage3+i*sizeof(struct stage1))->position, (stage3+i*sizeof(struct stage1))->fireman, (stage3+i*sizeof(struct stage1))->goose);
        
        printf("%p\n",(stage3+i*sizeof(struct stage1)));
        i++;
    }
    
    fclose(fr);
    
    if(fr == NULL){
        fprintf(stderr,"%s does not exist!\n", argv[1]);
        exit(1);
    }
    return 0;
    
}
 
bởi (🏅150)
E cho file input mà e dùng để test lên được không.
Bấm vào cái icon khoanh đỏ bên dưới để tải file lên nhé.

bởi
Toàn lỗi sơ đẳng về C
> struct stage1 *stage3 = (struct stage1*)malloc(iniCapacity*5);
Sao ko phải là malloc(iniCapacity * sizeof (struct stage1) ?

> void add(struct stage1 *arr, int index, struct stage1 value, int *size, int *capacity)
> arr = (struct stage1*)realloc(arr, sizeof(arr) *2);
Khi ra khỏi hàm add thì arr mới sẽ bị mất, ko save lại đc cho  stage3 nên sẽ bị lỗi segment fault. Cần sửa lại interface như sau
> void add(struct stage1** arr, ...)
Coding Guru là nơi dành cho cộng đồng lập trình viên Việt Nam hỗ trợ nhau về tất cả các vấn đề liên quan đến công nghệ.

Chúng ta hãy cùng nhau xây dựng một cộng đồng công nghệ Việt Nam mạnh mẽ, thúc đẩy và giúp đỡ nhau cùng phát triển, thăng tiến trong sự nghiệp.

***
Nơi đam mê hội tụ
***

Một số câu hỏi gần đây có thể tương tự hoặc liên quan ↓

0 👍
1 trả lời 107 lượt xem
hỏi bởi ẩn danh 28/10/2020
0 👍
1 trả lời 95 lượt xem
hỏi bởi ẩn danh 20/10/2019
–3 👍
0 trả lời 94 lượt xem
hỏi bởi Tuấn Tuấn 30/5/2020
...