首页 > 其他分享 >c99中sizeof的一些疑问

c99中sizeof的一些疑问

时间:2022-10-06 17:34:13浏览次数:84  
标签:char malloc c99 pSubDomainBuffer address sizeof 疑问 size

综述

问题来源于力扣的一道域名访问统计题目,我本想以建立首字母索引的方式去统计,但是在申请子域名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

相关文章

  • 【C/C++】strlen和sizeof
    1chara[]={'c','+','+'};2charc[]="c++";3cout<<strlen(a)<<endl;4cout<<strlen(c)<<endl;5cout<<sizeof(a)<<endl;6......
  • 简单的继承练习——疑问:私有属性在类的方法内调用时,有必要使用get,set方法嘛?
    要求:创建一个Circle类,设置半径属性和返回面积的方法,在无参构造器中初始化半径值为1。创建一个Cylinder类,继承Circle类,设置属性高和返回体积的方法,在无参构造器中初始化......
  • 关于BeanUtils.populate()方法的疑问?
    前几天的在写前端register.jsp的时候,发现前端需要封装的对象好多,网上查了下,竟然可以用BeanUtils来封装,于是在RegistUserServlet中用了BeanUtils来封装成user对象。......
  • (gcc常见的错误) 在windows系统环境下,使用gcc编译代码,printf 打印类似于%Lf,%Le等双精
    在windows环境下,有时候我们使用c99标准命令进行gcc编译,但会发现,结果和我们预想的不同。这是一种语义错误。如以下的代码:#include<stdio.h>intmain(void){float......
  • 疑问2022-8-25
    //预处理查询示例funcprepareQueryDemo(){ sqlStr:="selectid,name,agefromuserwhereid>?" stmt,err:=db.Prepare(sqlStr) iferr!=nil{ fmt.Pr......
  • sizeof 概念
    在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符。返回的结果是字节大小 以下是visualstudio编译器对应的大小  无符号数值(前面加上 unsigned )......
  • 39.反义疑问句
    反意疑问句(又称为“附加疑问句”)是在陈述句后面附加一个简短的疑问句,可以表示疑问,也可以表示说话者的某种倾向、强调或反问。反意疑问句的第一部分是一个完整的陈述句,第......