在 malloc() 之后使用 realloc() 来改变 unsigned char 数组的大小

Use realloc() after malloc() to change the size of unsigned char array

在main函数中,我使用malloc()创建了一个unsigned char数组:

int main()
{
  int length = 64;
  unsigned char *array = (unsigned char *)malloc(length * sizeof(unsigned char));
  ...
  change_size(array, length);
}

change_size() 定义在.h:

void change_size(unsigned char* arr, int len);

在 change_size 函数中,我将使用 realloc() 来增加数组大小:

void change size(unsigned char* arr, int len)
{
  printf("%d\n", len);
  len = len + 16;
  printf("%d\n", len);
  arr = (unsigned char *)realloc(arr, len * sizeof(unsigned char));
  int new_len = sizeof(arr)/sizeof(arr[0]);
  printf("%d\n", new_len);  
}

printf() 告诉我:

64
80
8

main() 中的数组大小也需要更新。

那么如何正确改变这个数组大小呢?

如果你想在调用者中改变它们的值,你需要将你的参数作为指针传递。这也意味着您将数组指针作为指针传递,因为 realloc 可能会更改它:

int change_size(unsigned char **arr, int *len)
{
    int new_len = *len + 16;
    unsigned char *new_arr = realloc(*arr, new_len);
    if (new_arr) {
        *len = new_len;
        *arr = new_arr;
    }
    return new_arr != NULL;
}

这里我修改了 change_size 以适应,并且还添加了一个 return 值来指示成功,因为 realloc 可能无法调整内存大小。为清楚起见,我删除了 printf 调用。哦,我还删除了强制转换,因为这在 C 中无效。

用法示例:

if (!change_size(&array, &len))
{
    perror("change_size failed");
}

最后要注意的是,您也可以使用 change_size 函数进行第一次分配,而不是调用 malloc。如果 realloc 的第一个参数为 NULL,它与 malloc.

做同样的事情

首先C不是保姆语, 你只需要基本的东西然后你可以做任何事情, 努力完全理解基础知识。

#include <stdio.h>
#include <stdlib.h>



int main(){
    int G1_Len=20;
    int G2_Len=40;
    char* G1=(char*)malloc(sizeof(char)*G1_Len);
    char* G2=(char*)malloc(sizeof(char)*G2_Len);
    printf("This is G1's Size:%d,Becuz G1 is Pointer\n",sizeof(G1));
    printf("%d\n",sizeof(G2));

    printf("This is what you need just add a variable remainber your size\n%d\n",G1_Len);
    printf("%d\n",G2_Len);
    /*alloc and free is a pair of memory control you need,remember least function thinking more is tip of C*/
    /*if you need alot of function but you cant control all try c++*/
    /*and if in c++ using new and delete dont use malloc free*/
    free(G1);
    free(G2);
    G1=NULL;
    G2=NULL;



    G1_Len=22;
    G1=(char*)malloc(sizeof(char)*G1_Len);
    //Now you have 22 bytes of char array




    free(G1);



    return 0;
}

好的,我回答。 @奇普斯特

#include <stdio.h>
#include <stdlib.h>

int change_size(char** arr, int len)
{
    char* nar=(char*)malloc(sizeof(char)*(len+16));
    if(nar){
        free(* arr);
        *arr=nar;
        nar[10]='K';//this will let you know its right
        return len+16;
    }
    return len;
}

int main(){
    int G1_Len=20;
    int G2_Len=40;
    char* G1=(char*)malloc(sizeof(char)*G1_Len);
    char* G2=(char*)malloc(sizeof(char)*G2_Len);
    printf("This is G1's Size:%d,Becuz G1 is Pointer\n",sizeof(G1));
    printf("%d\n",sizeof(G2));

    printf("This is what you need just add a variable remainber your size\n%d\n",G1_Len);
    printf("%d\n",G2_Len);
    /*alloc and free is a pair of memory control you need,remember least function thinking more is tip of C*/
    /*if you need alot of function but you cant control all try c++*/
    /*and if in c++ using new and delete dont use malloc free*/
    free(G1);
    free(G2);
    G1=NULL;
    G2=NULL;



    G1_Len=22;
    G1=(char*)malloc(sizeof(char)*G1_Len);
    //Now you have 22 bytes of char array


    printf("%d\n",G1);
    G1_Len=change_size(&G1,G1_Len);
    printf("%c\n",G1[10]);
    printf("%d\n",G1);
    printf("%d\n",G1_Len);
    free(G1);



    return 0;
}