【发布时间】:2023-03-24 04:28:01
【问题描述】:
我正在尝试修复我设置已分配空间的第 N 位的函数。如果 N 的大小大于 malloc 的空间大小,则重新分配更多空间以便能够设置第 N 位。
我的问题是,每当我设置比分配的空间高一点时,它就会设置两位。我已经玩了一段时间了,我感到很困惑。我觉得问题在于不正确地使用 realloc?
一个例子是,当我尝试设置第 52 位时,它会产生以下输出:
0001 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 0000 0000
第 52 位和第 20 位均已设置
我在这里复制了我的整个程序:https://repl.it/@dholton/Broken
更具体地说,这是我的功能:
Status bit_flags_set_flag( BIT_FLAGS hBit_flags, int flag_position ) {
bits *phBit_flags = ( bits * ) hBit_flags ;
int *new_data = NULL ;
if ( flag_position < phBit_flags -> capacity ) {
// Check to see if the bit request to set is lower than the memory allocated.
*phBit_flags -> data |= ( 1 << flag_position ) ;
} else if ( flag_position >= phBit_flags -> capacity ) {
// The bit requested is larger so realloc new data to reach the length of the requested bit.
new_data = ( int * ) realloc( phBit_flags -> data, ( flag_position / 8 ) + 1 ) ;
if ( new_data == NULL ) {
free( new_data ) ;
return FAILURE ;
}
free( phBit_flags -> data ) ;
phBit_flags -> data = new_data ;
phBit_flags -> size = flag_position ;
phBit_flags -> capacity = ( flag_position / 8 + 1 ) * 8 ;
// capacity is number of bits
*phBit_flags -> data |= ( 1 << flag_position ) ;
// Set nth bit
return SUCCESS ;
}
return FAILURE ;
}
【问题讨论】:
-
如果
new_data == NULL,那么释放它没有意义。你应该释放phBit_flags->data,然后设置它NULL。同样当new_data != NULL,你应该做phBit_flags->data = new_data,因为它可能是一个新的指针。在这种情况下,您不必释放phBit_flags->data。