具有有效索引的数组在c中未返回正确的状态代码

具有有效索引的数组在c中未返回正确的状态代码,c,arrays,struct,indexing,C,Arrays,Struct,Indexing,我这里有两个函数,对于intarr_set(),如果索引有效,我会将ia[index]处的值设置为val并返回intarr_OK,这是一个状态码,如果索引也有效,另一个函数intarr_get()会将*I设置为ia[index]。但是当我用我生成的一个随机数组测试我的函数时,它是[11 49 36 3 69 21 72 73 94 69 2 22 2 96 64 93],我收到一条消息说我的intarr_get()函数没有返回intarr_OK,即使我得到了一个有效的索引。有人知道我哪里出错了吗

我这里有两个函数,对于intarr_set(),如果索引有效,我会将ia[index]处的值设置为val并返回intarr_OK,这是一个状态码,如果索引也有效,另一个函数intarr_get()会将*I设置为ia[index]。但是当我用我生成的一个随机数组测试我的函数时,它是[11 49 36 3 69 21 72 73 94 69 2 22 2 96 64 93],我收到一条消息说我的intarr_get()函数没有返回intarr_OK,即使我得到了一个有效的索引。有人知道我哪里出错了吗

以下是我的数组结构:

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;
以下是我的intarr\U集合函数:

intarr_result_t intarr_set( intarr_t* ia, 
                unsigned int index, 
                int val )

{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        if ( ia->data[index] != 0 )
        {
            ia->data[index] = val;
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}
这是我的intarr_get函数:

intarr_result_t intarr_get( const intarr_t* ia, 
                unsigned int index, 
                int* i )
{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        if (ia->data[index] != 0)
        {
            if (i != NULL)
            {
                *i = ia->data[index];
            }
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}

intarr\u set
intarr\u get
函数的问题在于测试无效索引的方式。正确的处理方法是将
ai->data
的当前分配大小存储为
ai->len
。保持当前分配的大小可以方便地根据
ai->len
测试
索引
,以确定有效性。它还提供了一种当前方法,即使您在以后的某个时间使用
realloc
ai->data
也可以将大小保持在当前大小。所作的修改是:

intarr_result_t intarr_set( intarr_t* ia, 
                unsigned int index, 
                int val )
{
    ...
        // if ( ia->data[index] != 0 )
        if ( index < ia->len )
}

intarr_result_t intarr_get( const intarr_t* ia, 
                unsigned int index, 
                int* i )
{
    ...
        // if (ia->data[index] != 0)
        if ( index < ia->len )
}
输出:

Setting and retrieving array values, valid index (0 < index < 16)

  set myarr.data[11] = 1  (return: INTARR_OK)
  got myarr.data[11] = 1  (return: INTARR_OK)
  set myarr.data[49] = 2  (return: INTARR_BADINDEX)
  got myarr.data[49] = 1  (return: INTARR_BADINDEX)
  set myarr.data[36] = 3  (return: INTARR_BADINDEX)
  got myarr.data[36] = 1  (return: INTARR_BADINDEX)
  set myarr.data[ 3] = 4  (return: INTARR_OK)
  got myarr.data[ 3] = 4  (return: INTARR_OK)
  set myarr.data[69] = 5  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[21] = 6  (return: INTARR_BADINDEX)
  got myarr.data[21] = 4  (return: INTARR_BADINDEX)
  set myarr.data[72] = 7  (return: INTARR_BADINDEX)
  got myarr.data[72] = 4  (return: INTARR_BADINDEX)
  set myarr.data[73] = 8  (return: INTARR_BADINDEX)
  got myarr.data[73] = 4  (return: INTARR_BADINDEX)
  set myarr.data[94] = 9  (return: INTARR_BADINDEX)
  got myarr.data[94] = 4  (return: INTARR_BADINDEX)
  set myarr.data[69] = 10  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 11  (return: INTARR_OK)
  got myarr.data[ 2] = 11  (return: INTARR_OK)
  set myarr.data[22] = 12  (return: INTARR_BADINDEX)
  got myarr.data[22] = 11  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 13  (return: INTARR_OK)
  got myarr.data[ 2] = 13  (return: INTARR_OK)
  set myarr.data[96] = 14  (return: INTARR_BADINDEX)
  got myarr.data[96] = 13  (return: INTARR_BADINDEX)
  set myarr.data[64] = 15  (return: INTARR_BADINDEX)
  got myarr.data[64] = 13  (return: INTARR_BADINDEX)
  set myarr.data[93] = 16  (return: INTARR_BADINDEX)
  got myarr.data[93] = 13  (return: INTARR_BADINDEX)

Resulting myarr.data array

  myarr.data[ 0] = 0
  myarr.data[ 1] = 0
  myarr.data[ 2] = 13
  myarr.data[ 3] = 4
  myarr.data[ 4] = 0
  myarr.data[ 5] = 0
  myarr.data[ 6] = 0
  myarr.data[ 7] = 0
  myarr.data[ 8] = 0
  myarr.data[ 9] = 0
  myarr.data[10] = 0
  myarr.data[11] = 1
  myarr.data[12] = 0
  myarr.data[13] = 0
  myarr.data[14] = 0
  myarr.data[15] = 0
设置和检索数组值,有效索引(0
不确定是否与您的问题直接相关,但
ia->data[index]!=0不是对错误索引的正确检查。即使索引超出范围,值也可能不等于0;即使索引在数组的范围内,值也可能等于0(根据您的代码)。@Daniel是的,我也考虑过这一点。检查ia->data[index]len是否是检查有效索引的更好方法?不需要检查数据,只需检查索引本身<代码>索引len
此行:if(ia->data[index]!=0)仅表示ia->data指针的偏移量(可能是随机的)恰好包含0。您真正想要做的是将索引与ia->len进行比较,即如果(indexlen),这是因为C没有数组边界检查。此外,这种未经检查/随机写入某个偏移量到malloc的内存区域可能会导致1)malloc阵列结构损坏2)导致seg故障事件3)导致一些随机灾难。
Setting and retrieving array values, valid index (0 < index < 16)

  set myarr.data[11] = 1  (return: INTARR_OK)
  got myarr.data[11] = 1  (return: INTARR_OK)
  set myarr.data[49] = 2  (return: INTARR_BADINDEX)
  got myarr.data[49] = 1  (return: INTARR_BADINDEX)
  set myarr.data[36] = 3  (return: INTARR_BADINDEX)
  got myarr.data[36] = 1  (return: INTARR_BADINDEX)
  set myarr.data[ 3] = 4  (return: INTARR_OK)
  got myarr.data[ 3] = 4  (return: INTARR_OK)
  set myarr.data[69] = 5  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[21] = 6  (return: INTARR_BADINDEX)
  got myarr.data[21] = 4  (return: INTARR_BADINDEX)
  set myarr.data[72] = 7  (return: INTARR_BADINDEX)
  got myarr.data[72] = 4  (return: INTARR_BADINDEX)
  set myarr.data[73] = 8  (return: INTARR_BADINDEX)
  got myarr.data[73] = 4  (return: INTARR_BADINDEX)
  set myarr.data[94] = 9  (return: INTARR_BADINDEX)
  got myarr.data[94] = 4  (return: INTARR_BADINDEX)
  set myarr.data[69] = 10  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 11  (return: INTARR_OK)
  got myarr.data[ 2] = 11  (return: INTARR_OK)
  set myarr.data[22] = 12  (return: INTARR_BADINDEX)
  got myarr.data[22] = 11  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 13  (return: INTARR_OK)
  got myarr.data[ 2] = 13  (return: INTARR_OK)
  set myarr.data[96] = 14  (return: INTARR_BADINDEX)
  got myarr.data[96] = 13  (return: INTARR_BADINDEX)
  set myarr.data[64] = 15  (return: INTARR_BADINDEX)
  got myarr.data[64] = 13  (return: INTARR_BADINDEX)
  set myarr.data[93] = 16  (return: INTARR_BADINDEX)
  got myarr.data[93] = 13  (return: INTARR_BADINDEX)

Resulting myarr.data array

  myarr.data[ 0] = 0
  myarr.data[ 1] = 0
  myarr.data[ 2] = 13
  myarr.data[ 3] = 4
  myarr.data[ 4] = 0
  myarr.data[ 5] = 0
  myarr.data[ 6] = 0
  myarr.data[ 7] = 0
  myarr.data[ 8] = 0
  myarr.data[ 9] = 0
  myarr.data[10] = 0
  myarr.data[11] = 1
  myarr.data[12] = 0
  myarr.data[13] = 0
  myarr.data[14] = 0
  myarr.data[15] = 0