我试图将数据存储到指针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/