我正在用C编程。我还使用一个库来创建可以通过消息在它们之间进行通信的任务。这些消息的内容必须是指向要交换的数据的指针。
在我的情况下,我想发送一个数组,所以我发送一个指向数组的指针。在接收任务中,我可以通过增加指针来访问不同的元素,但是,有没有办法知道数组有多长?
提前谢谢。
答案 0 :(得分:2)
不,没有办法这样做,因为数组在传递给函数时会衰减为指针,因此有关大小的所有信息都会丢失。
您可以包含另一个参数来指定数组长度
void func(int len, int arr[]);
您可以使用特殊值标记数组的结尾(可能像argv
那样)
您可以将数组放入结构中并传递(并遭受性能损失)或将指针传递给结构
struct args {
int arr[100];
};
如果你决定走第一条路线,你可以使用C99的一个很好的功能,即使它实际上没有强制arr
至少有len
个元素:
void func(int len, int arr[len]);
答案 1 :(得分:1)
答案 2 :(得分:0)
没有。所以考虑一些略有不同的东西。
struct arrayinfo {
struct element *array;
int count;
};
然后您可以将指针传递给struct arrayinfo
类型,并且您的接收任务将知道您的数组中有多少元素。
另一种技术是制作你的数组和指针数组。使数组中的元素大于必要值,并将最后一个元素设置为NULL。
答案 3 :(得分:0)
不,除非你也发送数组的大小或在数组的末尾设置一个监护人值,否则这是不可能的。
我建议您不要直接发送数组,而是使用中间结构,如下所示:
struct intermediary {
int *the_array; /* the pointer to the array */
size_t size; /* the array size */
};
在您发送结构的消息中,而不是数组本身。
答案 4 :(得分:0)
无法在存储消息的缓冲区末尾使用某种哨兵值。这应该是一个值,你不会在消息中的任何地方找到它。根据这些消息的类型,可能存在这样的值:如果您的消息包含正整数,“INF”或“BIG_INT”数字等,则通常为负数。然后,您必须处理您的消息哨兵价值。像这样:
#include <stdlib.h>
#include <string.h>
#define N 100
#define ENDTAG -999999
void foo( int *arr ){
int i = 0;
while( arr[i] != ENDTAG ){
//do whatever
i++;
}
}
int main( void ){
int *arr = (int *) malloc( sizeof(int) * N );
//fill the array, no matter how.
// ...
//set the sentry value
arr[N-1] = ENDTAG;
foo( arr );
free( arr );
return 0;
}
这可能听起来很简单,但我实际上不止一次使用过这样的东西。但你必须绝对确定你会采取一些有限类型的信息。