获取指定索引之间数组的子数组
Get subarray of an array between specified indexes
我对 C 比较陌生。
在我的程序中,我有一个结构数组,它会定期附加。
我想写一个函数,它允许我return结构从这个数组中的一个索引到另一个:
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 中做到这一点,我尝试了很多东西,我在这里。
将 Log *myEvent
和 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;
}
}
提供的代码存在几个问题,其中:
- 您的函数声明它 return 是一个
struct Log *
,但它实际上并没有 return 任何东西。
- 我想这个想法是函数会 return
events
,但会衰减到 struct Log **
,而你需要 struct Log *
.
- 此外,return
events
也没有用,因为该数组具有自动存储期限。也就是说,它的生命周期在创建它的块执行结束时结束。在这种情况下,从函数接收到的指针将无效。
- 您正在取消引用
events
的(指针)元素,但没有将它们设置为指向任何东西。
您可以做两件主要的事情:
Return 指向文件范围 myEvent
数组的适当元素的指针。这将避免任何分配或复制任何东西的需要,但这是一把双刃剑。然后,您将通过 myEvent
和 returned 指针上的不同索引访问相同的 struct Log
对象,这可能是也可能不是您想要实现的。但是,在那种情况下,函数就太过分了,因为您只需要
struct Log *someEvents = myEvent + from;
或者,让您的函数为 struct Log
对象的所需副本数动态分配 space,从 myEvent
复制所需数据,然后 return 指向已分配 space 的指针。在这种情况下,对于 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;
}
动态分配的 space 会一直存在,直到您使用 free()
显式解除分配。 (您最终必须在丢失指向已分配 space 的指针之前执行此操作,否则会发生内存泄漏。)
我对 C 比较陌生。 在我的程序中,我有一个结构数组,它会定期附加。
我想写一个函数,它允许我return结构从这个数组中的一个索引到另一个:
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 中做到这一点,我尝试了很多东西,我在这里。
将 Log *myEvent
和 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;
}
}
提供的代码存在几个问题,其中:
- 您的函数声明它 return 是一个
struct Log *
,但它实际上并没有 return 任何东西。 - 我想这个想法是函数会 return
events
,但会衰减到struct Log **
,而你需要struct Log *
. - 此外,return
events
也没有用,因为该数组具有自动存储期限。也就是说,它的生命周期在创建它的块执行结束时结束。在这种情况下,从函数接收到的指针将无效。 - 您正在取消引用
events
的(指针)元素,但没有将它们设置为指向任何东西。
您可以做两件主要的事情:
Return 指向文件范围
myEvent
数组的适当元素的指针。这将避免任何分配或复制任何东西的需要,但这是一把双刃剑。然后,您将通过myEvent
和 returned 指针上的不同索引访问相同的struct Log
对象,这可能是也可能不是您想要实现的。但是,在那种情况下,函数就太过分了,因为您只需要struct Log *someEvents = myEvent + from;
或者,让您的函数为
struct Log
对象的所需副本数动态分配 space,从myEvent
复制所需数据,然后 return 指向已分配 space 的指针。在这种情况下,对于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; }
动态分配的 space 会一直存在,直到您使用 free()
显式解除分配。 (您最终必须在丢失指向已分配 space 的指针之前执行此操作,否则会发生内存泄漏。)