综述
问题来源于力扣的一道域名访问统计题目,我本想以建立首字母索引的方式去统计,但是在申请子域名buffer的地方发现使用malloc(sizeof(char)4)申请出来的buffer每次+1只能增加一个内存单元。
原题链接:子域名访问计数
结题思路
疑问点
- malloc(sizeof(char)4)在64位机上申请的内存大小不是32字节(以解决)
- 在一个给定32个字节的存放指针的内存空间怎么使用
malloc(sizeof(char)4)在64位机上申请的内存大小不是32字节
for(i = 0; i < 26; i++){
pSubDomainBuffer = (char*)malloc(sizeof(char*) * 4);
printf("pSubDomainBuffer[0] address:%p, size: %d\n", pSubDomainBuffer, sizeof(pSubDomainBuffer));
printf("pSubDomainBuffer[1] address:%p, size: %d\n", &pSubDomainBuffer[1], sizeof(pSubDomainBuffer[1]));
printf("pSubDomainBuffer[2] address:%p, size: %d\n", &pSubDomainBuffer[2], sizeof(pSubDomainBuffer[2]));
printf("pSubDomainBuffer[3] address:%p, size: %d\n", &pSubDomainBuffer[3], sizeof(pSubDomainBuffer[3]));
if(NULL == pSubDomainBuffer){
printf("failed malloc subDomain buffer.\n");
return 2;
}
memset(pSubDomainBuffer, 0x0, sizeof(char*) * 4);
pDomainBuffer[i] = pSubDomainBuffer;
}
运行结果:
pSubDomainBuffer[0] address:0x2476010, size: 8
pSubDomainBuffer[1] address:0x2476011, size: 1
pSubDomainBuffer[2] address:0x2476012, size: 1
pSubDomainBuffer[3] address:0x2476013, size: 1
百度到sizeof对于指针的的取值,64位机器上始终为8(申请内存空间为32个字节)。
在一个给定32个字节的存放指针的内存空间怎么使用
pDomainBuffer[i]存放的是4个字节的指针地址空间的内存地址,这片内存空间使用malloc申请,在访问的时候不能像普通赋值那样 pDoaminBuffer[i][j] = pLinkNode,直接赋值左侧j从2,3,4开始都是一个字节,结构体地址赋值会数据丢失。但是使用memcpy的话又会产生段错误。(遗留,我还是太弱了)
for(j = 0; j < 4; j++){
pLinkNode = (myLINKLIST *)malloc(sizeof(myLINKLIST) * 1);
memcpy(pDomainBuffer[i][j], pLinkNode, sizeof(char *));
}
小结
毕业第一年入职智能家居,做路由器运营商平台对接,代码纯C写了一年,之后转岗测试,C语言基本也就一年左右没使用,现在使用感觉好陌生,怎么申请指针数组,给一块内存要进行指针地址赋值也差不多忘记了。难受啊
标签:char,malloc,c99,pSubDomainBuffer,address,sizeof,疑问,size From: https://www.cnblogs.com/SlowClimb/p/16757782.html