为什么我有分段错误?

时间:2014-12-21 03:51:23

标签: c random struct segmentation-fault

/* This Program generates a file with a pseudo-random number of st_record_t structures. The file is passed by command line arguments. The program must by executed, in UNIX, this way: ./file_gen -path <path> */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "types.h"

#define MSG_INVALID_INPUT "Your input was not valid"

#define CMD_FLAG_PATH_POSITION 1 
#define CMD_ARG_PATH_POSITION 2

#define CMD_FLAG_PATH "-path"

#define SDM_MAX 10000.0

status_t validate_arguments (int argc, char * argv []);

int main (int argc, char * argv [])
{
    FILE * fi;
    size_t i;
    st_record_t aux_struct, aux2_struct;
    int size;

    if ((validate_arguments(argc, argv))!= OK)
    {
        fprintf(stderr, "%s\n", MSG_INVALID_INPUT);
        return EXIT_FAILURE;
    }

    if((fi = fopen(argv[CMD_ARG_PATH_POSITION], "wb")) == NULL)
        return EXIT_FAILURE;

    srand(time(NULL));
    for (i=0; i<(size=100); i++)
    {
        aux_struct.SDM = (((float)rand()/(float)(RAND_MAX)) * SDM_MAX); /*pseudo-random real number between 0 and SDM_MAX*/
        (aux_struct.ID) = i;
        (aux_struct.coordinates)->latitude.deg = rand()%180;
        (aux_struct.coordinates)->latitude.min = rand()%60; 
        (aux_struct.coordinates)->latitude.sec = rand()%60;
        (aux_struct.coordinates)->longitude.deg = rand()%180;
        (aux_struct.coordinates)->longitude.min = rand()%60;
        (aux_struct.coordinates)->longitude.sec = rand()%60;
        if((fwrite (&aux_struct, sizeof(st_record_t), 1, fi))!=1)
            return ERROR_WRITING_FILE;
      }

    if(fclose(fi) == EOF)
        return EXIT_FAILURE

    return EXIT_SUCCESS;
}

问题在于(aux_struct.coordinates)->latitude.deg = rand()%180行。如果不是使用随机数我选择一个,这将不会发生

st_record_t结构以这种方式定义:

typedef struct {
        unsigned char deg, min, sec;
        }angle_t;

typedef struct {
        angle_t latitude, longitude;
        }st_coord_t;

typedef struct {
        float SDM;
        size_t ID;
        st_coord_t * coordinates;
        }st_record_t;

3 个答案:

答案 0 :(得分:1)

分段错误与随机数无关,这是因为你永远不会为aux_struct.coordinates分配内存。

要解决此问题,请使用以下内容:

aux_struct.coordinates = malloc(sizeof(st_coord_t));

请记住在不再使用时释放内存。

答案 1 :(得分:1)

除了缺少“coordinates”成员初始化的问题之外,应该指出fwrite()不会做你想要的。它只会写入st_record_t的内容。指针“coordinates”的值在进行写入的进程之外没有任何意义,并且它指向的st_coord_t结构中的数据根本不会被写入。

您可能希望查看类似hdf5的内容,以便以可移植的方式将复杂的二进制数据结构写入文件。

答案 2 :(得分:0)

你有

typedef struct {
        float SDM;
        size_t ID;
        st_coord_t * coordinates;
        }st_record_t;

如您所见,coordinatesst_coord_t类型的指针。您需要使用malloc

为其分配内存
aux_struct.coordinates=malloc(sizeof(st_coord_t));

您需要在使用后释放已分配的内存:

free(aux_struct.coordinates);

请注意,如果您想使用coordinates,则必须为aux2_struct分配内存,之后在使用后将其释放。