编辑代码

#include <stdio.h>
#include <stdlib.h>
typedef struct st
{
    unsigned char *pucBuffer;
    unsigned int uiBufSize;
    unsigned int uiVBufIdx;
} ST;
int main () {
    ST data1[10];
    ST *data2 = NULL;
    unsigned char str[10];

    str[0] = '\0';
    for (int i = 0; i < 9; i++)
    {
        str[i] = 'a' + i;
    }

    // for (int j = 0; j < 10; j++)
    // {
    //     printf("%c ", str[j]);
    // }

    memset(data1, 0, sizeof(data1));
    // printf("sizeof data1 = %d\n", sizeof(data1)); // 数组头,大小为sizeof(ST) * 10 = 160

    // if (data1[0].pucBuffer == NULL)
    // {
    //     printf("here\n");
    // }

    // printf("uiBufSize = %d\n", data1[0].uiBufSize);

    data2 = data1;
    // printf("sizeof data2 = %d\n", sizeof(data2));  // 指针,大小为8

    for (int i = 0; i < 10; i++)
    {
        data2[i].pucBuffer = (unsigned char *)malloc(10);
        if (data2[i].pucBuffer == NULL)
        {
            printf("malloc failed: %d\n", i);
            break;
        }
        // printf("%s\n", data2[i].pucBuffer);
        data2[i].pucBuffer[0] = '\0';
        memcpy(data2[i].pucBuffer, str, 10);
        data2[i].uiBufSize = 10;
        data2[i].uiVBufIdx = 100;
    }


    // printf("%p\n", data2[0]);
    for (int i = 0; i < 5; i++)
    {
        if (data2[i].pucBuffer != NULL)
        {
            // for (int j = 0; j < 10; j++)
            // {
            //     printf("%c ", data2[i].pucBuffer[j]);
            // }
            // printf("\n");

            // free掉数据
            free(data2[i].pucBuffer);
            data2[i].pucBuffer = NULL;
            memset(&data2[i], 0, sizeof(ST));
        }
    }
    
    printf("%d\n", data2[0].uiBufSize);

    /*========================================================================*/

    for (int i = 0; i < 10; i++)
    {
        data2[i].pucBuffer = (unsigned char *)malloc(10);
        if (data2[i].pucBuffer == NULL)
        {
            printf("malloc failed: %d\n", i);
            break;
        }
        // printf("%s\n", data2[i].pucBuffer);
        data2[i].pucBuffer[0] = '\0';
        memcpy(data2[i].pucBuffer, str, 5);
        data2[i].uiBufSize = 10;
        data2[i].uiVBufIdx = 100;
    }

    for (int i = 0; i < 10; i++)
    {
        if (data2[i].pucBuffer != NULL)
        {
            for (int j = 0; j < 5; j++)
            {
                printf("%c ", data2[i].pucBuffer[j]);
            }
            printf("\n");

        }
    }

    // if (data2[0].pucBuffer == NULL)
    // {
    //     printf("已经被释放了!\n");
    // }
 

    // data2 = NULL;  // data2是data1赋值的,data1不是动态申请的内存,因此不能使用free(data2).
    // if (data2)
    // {
    //     printf("data2 = %p\n", data2);
    // }

    // if (data1)
    // {
    //     printf("data1 = %p\n", data1);
    // }

    return 0;

}