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)1sizeof 不跟踪动态分配,它是一个编译时工具,可以为您提供类型的大小,在本例中为 unsigned char.

您必须手动跟踪数组大小以计算新的所需大小。

你的程序确实改变了内存块的大小。它将原始内存块的大小从 4 个字节更改为 5 个字节。它更改为 5 个字节,因为您实际上是在执行 sizeof(unsigned char) + 4,即 1 + 4 = 5。如果您想将大小加倍,请执行 count*sizeof(unsigned char) + count。这里有两点需要注意:

  1. sizeof函数return是数据类型的大小,而不是分配字节的大小。没有办法知道动态分配内存的大小。
  2. 函数 realloc(以及 malloccalloc)并不总是保证 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 返回了数组的大小,这当然是错误的,因为它给了你一个类型的大小。

很高兴我能从中学到一些东西。

  1. sizeof用于计算数据类型或数组的大小。指针和数组非常相似,但它们是不同的东西。对于 int *apsizeof(ap) 将在 x86 上 return 4,sizeof(*ap) 将 return 4;对于 int a[10]sizeof(a) 将 return 40。

  2. sizeof表达式是在编译时处理的,所以它会是一个常量,在你运行程序之前写入可执行文件。

  3. mallocrealloc 不保持大小。

  4. 如果realloc成功,它将重新分配请求的大小。所以在reallocreturns之后不需要检查大小,但是应该检查realloc的return值,确保realloc成功。