C realloc 不改变数组
C realloc not changing array
因此,首先我已经查看了一些问题,包括 this one 和 none,其中似乎有帮助。
我只是想编写一个使用 realloc()
.
扩展数组大小的函数
我的代码目前是这样的:
unsigned char *xtnd = malloc(4);
xtndc(&xtnd, 4);
// sizeof(*xtnd) should now be 8
void xtndc ( unsigned char ** bytesRef , uint8_t count ) {
*bytesRef = realloc(*bytesRef, (sizeof(**bytesRef)) + count);
}
但无论我做什么,xtnd
的大小似乎总是 4。在 运行 xtndc()
之后,它现在应该是 8 个字节长。
有什么建议吗?
**bytesRef
的类型是unsigned char
,所以sizeof(**bytesRef)
是1
。 sizeof
不跟踪动态分配,它是一个编译时工具,可以为您提供类型的大小,在本例中为 unsigned char
.
您必须手动跟踪数组大小以计算新的所需大小。
你的程序确实改变了内存块的大小。它将原始内存块的大小从 4 个字节更改为 5 个字节。它更改为 5 个字节,因为您实际上是在执行 sizeof(unsigned char) + 4
,即 1 + 4 = 5。如果您想将大小加倍,请执行 count*sizeof(unsigned char) + count
。这里有两点需要注意:
sizeof
函数return是数据类型的大小,而不是分配字节的大小。没有办法知道动态分配内存的大小。
- 函数
realloc
(以及 malloc
和 calloc
)并不总是保证 return 请求的重新分配。它可能会也可能不会一直成功。
我用下面的代码解决了这个问题。
typedef struct CArrPtr {
unsigned char* ptr;
size_t size;
} CArrPtr;
void xtndc ( CArrPtr *bytesRef, uint8_t count );
. . .
CArrPtr xtnd = { .ptr = malloc(4), .size = 4 };
xtndc( &xtnd, 4 );
// xtnd.size is now 8 bytes
. . .
void xtndc ( CArrPtr *bytesRef, uint8_t count ) {
unsigned char *nptr;
if((nptr = realloc(bytesRef->ptr, bytesRef->size + count)) != 0)
{
bytesRef->ptr = nptr;
bytesRef->size = bytesRef->size + count;
}
}
由于我是C语言的新手,我从中学到的是malloc
专门创建了一个指向内存块的指针,但是你无法直接访问内存块的信息。相反,您还必须在某处存储使用 malloc 创建的数组的大小。
由于过去我一直使用 unsigned char arr[size];
初始化数组,然后在其上使用 sizeof
,我的印象是 sizeof
返回了数组的大小,这当然是错误的,因为它给了你一个类型的大小。
很高兴我能从中学到一些东西。
sizeof
用于计算数据类型或数组的大小。指针和数组非常相似,但它们是不同的东西。对于 int *ap
,sizeof(ap)
将在 x86 上 return 4,sizeof(*ap)
将 return 4;对于 int a[10]
,sizeof(a)
将 return 40。
sizeof
表达式是在编译时处理的,所以它会是一个常量,在你运行程序之前写入可执行文件。
malloc
和 realloc
不保持大小。
如果realloc
成功,它将重新分配请求的大小。所以在realloc
returns之后不需要检查大小,但是应该检查realloc
的return值,确保realloc
成功。
因此,首先我已经查看了一些问题,包括 this one 和 none,其中似乎有帮助。
我只是想编写一个使用 realloc()
.
我的代码目前是这样的:
unsigned char *xtnd = malloc(4);
xtndc(&xtnd, 4);
// sizeof(*xtnd) should now be 8
void xtndc ( unsigned char ** bytesRef , uint8_t count ) {
*bytesRef = realloc(*bytesRef, (sizeof(**bytesRef)) + count);
}
但无论我做什么,xtnd
的大小似乎总是 4。在 运行 xtndc()
之后,它现在应该是 8 个字节长。
有什么建议吗?
**bytesRef
的类型是unsigned char
,所以sizeof(**bytesRef)
是1
。 sizeof
不跟踪动态分配,它是一个编译时工具,可以为您提供类型的大小,在本例中为 unsigned char
.
您必须手动跟踪数组大小以计算新的所需大小。
你的程序确实改变了内存块的大小。它将原始内存块的大小从 4 个字节更改为 5 个字节。它更改为 5 个字节,因为您实际上是在执行 sizeof(unsigned char) + 4
,即 1 + 4 = 5。如果您想将大小加倍,请执行 count*sizeof(unsigned char) + count
。这里有两点需要注意:
sizeof
函数return是数据类型的大小,而不是分配字节的大小。没有办法知道动态分配内存的大小。- 函数
realloc
(以及malloc
和calloc
)并不总是保证 return 请求的重新分配。它可能会也可能不会一直成功。
我用下面的代码解决了这个问题。
typedef struct CArrPtr {
unsigned char* ptr;
size_t size;
} CArrPtr;
void xtndc ( CArrPtr *bytesRef, uint8_t count );
. . .
CArrPtr xtnd = { .ptr = malloc(4), .size = 4 };
xtndc( &xtnd, 4 );
// xtnd.size is now 8 bytes
. . .
void xtndc ( CArrPtr *bytesRef, uint8_t count ) {
unsigned char *nptr;
if((nptr = realloc(bytesRef->ptr, bytesRef->size + count)) != 0)
{
bytesRef->ptr = nptr;
bytesRef->size = bytesRef->size + count;
}
}
由于我是C语言的新手,我从中学到的是malloc
专门创建了一个指向内存块的指针,但是你无法直接访问内存块的信息。相反,您还必须在某处存储使用 malloc 创建的数组的大小。
由于过去我一直使用 unsigned char arr[size];
初始化数组,然后在其上使用 sizeof
,我的印象是 sizeof
返回了数组的大小,这当然是错误的,因为它给了你一个类型的大小。
很高兴我能从中学到一些东西。
sizeof
用于计算数据类型或数组的大小。指针和数组非常相似,但它们是不同的东西。对于int *ap
,sizeof(ap)
将在 x86 上 return 4,sizeof(*ap)
将 return 4;对于int a[10]
,sizeof(a)
将 return 40。sizeof
表达式是在编译时处理的,所以它会是一个常量,在你运行程序之前写入可执行文件。malloc
和realloc
不保持大小。如果
realloc
成功,它将重新分配请求的大小。所以在realloc
returns之后不需要检查大小,但是应该检查realloc
的return值,确保realloc
成功。