具有有效索引的数组在c中未返回正确的状态代码
我这里有两个函数,对于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,即使我得到了一个有效的索引。有人知道我哪里出错了吗 以下是我的数组结构:具有有效索引的数组在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,即使我得到了一个有效的索引。有人知道我哪里出错了吗
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进行比较,即如果(indexSetting 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