c - 通过递增指针直到分配的内存末尾来将数据存储在 char 缓冲区中

标签 c pointers

我试图将数据存储到指针credit_data 指向的字符缓冲区。 每次复制数据时我都会增加指针。在最终增量之后,我通过读取字节数的计数器来递减指针,然后使用它来递减指针并获取正确的地址。但是当我尝试打印存储在缓冲区中的最终字符串时,我得到了 NULL。我是指针和指针算术的新手。请指导我。

#define DP_RMD_PERSON_TITLE_MAX_LEN     (64)
#define DP_RMD_FAMILY_TITLE_MAX_LEN     (64)
int CaluclateSizeOfCreditList()
{
    short dataset_idx = 0,str_len =0, num_datasets = 8; //variable
    str_len = sizeof(short);
    for (dataset_idx = 0; dataset_idx < num_datasets; dataset_idx++) {
        str_len += sizeof(short)  + DP_RMD_PERSON_TITLE_MAX_LEN + DP_RMD_PERSON_TITLE_MAX_LEN; 
    }
    return str_len;
}
void main () 
{
    unsigned char* credit_data = NULL;
    //unsigned char* dp_credit_data;
    short num_credits = 8 , classification = 2, dataset_idx = 0, i = 0, len = 0;
    char *person_title = "robert"; char *person_given_name = "Wuhl";

    len = CaluclateSizeOfCreditList();
    credit_data = (unsigned char *)malloc(len);
    if(!credit_data) return;
    memset(credit_data, 0x00, len);
    //dp_credit_data = credit_data;
    printf("\n credit_data pointing to address location %p",credit_data);

    *credit_data = num_credits;
    credit_data += sizeof(short);
    i += sizeof(short);
    for (dataset_idx = 0; dataset_idx < num_credits; dataset_idx++)
    {
        *credit_data = (unsigned char)classification;
        credit_data += sizeof(short);
        i += sizeof(short);

        len = strlen(person_title);
        len++;
        memcpy(credit_data,person_title,len);
        credit_data += DP_RMD_PERSON_TITLE_MAX_LEN;
        i += DP_RMD_PERSON_TITLE_MAX_LEN;

        len = strlen(person_given_name);
        len++;
        memcpy(credit_data,person_given_name,len);
        if(dataset_idx < 7)
        {
            credit_data += DP_RMD_PERSON_TITLE_MAX_LEN;
            i += DP_RMD_PERSON_TITLE_MAX_LEN;
        }
    }
    *credit_data = '\0';
    printf("\n credit_data pointing to address location after increment %p",credit_data);
    credit_data = credit_data - i;
    //credit_data = dp_credit_data;
    printf("\ncredit_data is [%s]\n",credit_data);
//Free the allocated memory
}

问题陈述是,我有一个结构,其成员变量是另一个结构的数组。

  typedef struct _DP_RMD_CREDIT_
  {
     DP_RMD_CREDIT_TYPE      classification; //ENUM     
     UBYTE                   *person_title;        
     UBYTE                   *person_given_name;   
     UBYTE                   *person_family_name;  
     UBYTE                   *organisation;        
  } DP_RMD_CREDIT;

  typedef struct _DP_RMD_CREDIT_LIST_
  {
     USHORT          num_credits;
     DP_RMD_CREDIT   credit[DP_RMD_MAX_CREDITS];
  } DP_RMD_CREDIT_LIST;

我想将这些成员变量的所有值存储在缓冲区中,并以 BLOB 形式更新到 sqlite db。请帮助我。

最佳答案

你的代码完全没有意义(抱歉这么直白)。

函数 CaluclateSizeOfCreditList() 将始终返回 1042,那么为什么要使用该函数。

 *credit_data = num_credits;
 credit_data += sizeof(short);

上面将一个 int 放入 *credit_data 中,然后以 short 的大小递增。没有任何意义。

    *credit_data = (unsigned char *)classification;
    credit_data += sizeof(int);

上面的代码使classification成为一个指向char的指针,然后将该东西复制到credit_data。这里你认为编译器会将classification的值转换为一串数字。不,不。然后将 credit_data 增加到 int 的大小。你有两个想法:分类做成一串数字(多少??);原来是一个 int 所以,随着该大小的增加。坏想法。

*credit_data = '\0';
if(NULL != credit_data)

这以空字符终止 credit_data ,就好像它是一个字符串(但它填充了二进制数据),然后测试 credit_data 是否确实有内存(从 malloc) 分配。我想说,恰恰相反。

现在您想知道为什么 printf 不显示任何内容...

我建议你读一本关于C的书。

关于c - 通过递增指针直到分配的内存末尾来将数据存储在 char 缓冲区中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535216/

相关文章:

c - Xilinx ARM 编译器不会提示 void 指针算术,并且会生成正确的结果。为什么?

c++ - 将 int 存储在 char 数组中?

c - foo(int* arr) 和 foo(int arr[]) 有什么区别?

c - 删除长度为 N 的字符串中第 k 个字符的最佳算法是什么?

c - 具有长链表的多线程

delphi - 检查变量是否为零的最佳方法?

c++ - 我应该删除指向静态的本地指针吗

C 数组到 Char 指针

c++ - int **const p 的行为与常量不同

c - 如何不断检查计算出的数字是否为整数?