0

我对 C 比较陌生。在我的程序中,我有一个结构数组,它会定期附加。

我想编写一个函数,它允许我将结构从索引返回到该数组中的另一个:

struct Log{
    int sensorState;
    int speed;
};

struct Log myEvent[10000];

这是我所做的,但它不起作用(SIGSEV被抛出):

struct Log *getEvents(int from, int to){
    struct Log *events[to-from+1];

    for(int i=0; i<=to-from;i++){
        events[i]->speed = myEvent[i].speed;
        events[i]->sensorState = myEvent[i].sensorState;
    }
    return events 
} 

感觉在 Java 或 Python 中会很容易。但我无法在 C 中做到这一点,我尝试了很多东西,我就在这里。

4

2 回答 2

2

呈现的代码存在几个问题,其中包括:

  • 您的函数声明它返回 a struct Log *,但实际上并没有返回任何内容。
  • 我想这个想法是函数会返回events,但会衰减到 a struct Log **,而你需要 a struct Log *
  • 此外,返回没有用,events因为该数组具有自动存储持续时间。也就是说,它的生命周期在创建它的块执行结束时结束。在这种情况下,从函数接收到的指针将是无效的。
  • 您在events没有将它们设置为指向任何东西的情况下取消引用(指针)元素。

你可以做两件主要的事情:

  1. 返回指向文件范围myEvent数组的适当元素的指针。这将避免任何分配或复制任何东西的需要,但这是一把双刃剑。然后,您将struct Log通过返回指针上的不同索引访问相同的对象myEvent,这可能是也可能不是您想要实现的目标。但是,在这种情况下,一个函数是多余的,因为你所需要的只是

    struct Log *someEvents = myEvent + from;
    
  2. 或者,让您的函数为所需数量的struct Log对象副本动态分配空间,从 复制所需数据myEvent,并返回指向已分配空间的指针。在这种情况下,对于结构的特定内容,使用它来进行复制struct Log会更清晰、更有效:memcpy()

    struct Log *getEvents(int from, int to){
        size_t size = (to - from + 1) * sizeof(struct Log);
        struct Log *events = malloc(size);
    
        if (events) {
            memcpy(events, myEvent + from, size);
        } // else malloc failed and 'events' is null
    
        return events;
    } 
    

动态分配的空间一直存在,直到您使用free(). (在丢失指向已分配空间的指针之前,您最终必须这样做,否则您会发生内存泄漏。)

于 2020-05-24T12:54:04.783 回答
0

传递给函数Log *myEventand Log *events和索引。

typedef struct Log{
        int sensorState;
        int speed;
    }Log;


    void getEvents(Log *myEvent,Log *events,int from, int to){

        for(int i=from; i<to-from+1;i++){
            events[i].speed = myEvent[i].speed;
            events[i].sensorState = myEvent[i].sensorState;
        }
    } 
于 2020-05-24T12:47:49.720 回答