指向数组边界问题的指针

时间:2011-08-24 14:16:58

标签: c arrays pointers

我正在用C编程。我还使用一个库来创建可以通过消息在它们之间进行通信的任务。这些消息的内容必须是指向要交换的数据的指针。

在我的情况下,我想发送一个数组,所以我发送一个指向数组的指针。在接收任务中,我可以通过增加指针来访问不同的元素,但是,有没有办法知道数组有多长?

提前谢谢。

5 个答案:

答案 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;
}

这可能听起来很简单,但我实际上不止一次使用过这样的东西。但你必须绝对确定你会采取一些有限类型的信息。