这种数组内存是多少?

whati 2007-08-17 09:34:53
比如const char* a[4] = {"44","111","22","44444"};

怎么计算,sizeof a?不对
...全文
1161 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxlijinzhu 2007-08-22
  • 打赏
  • 举报
回复
指针数组!!!

zhxz1981() :

关键是上面居然有一种理解的结果居然也是16, 真巧, 哈哈哈.
zhxz1981 2007-08-22
  • 打赏
  • 举报
回复
这么个简单的问题居然有那么多结果?
编译跑一遍就得出结果了,纸上谈兵顶个鸟用!!!
jhs1982419 2007-08-20
  • 打赏
  • 举报
回复
晕倒,居然还有人说指针占字节.
食人族哲学家 2007-08-20
  • 打赏
  • 举报
回复
果然是我估计的那样,问题表诉有问题。那我请参考我前面提到的第三条。
试答一下:
5.是什么空间一般程序员好象不需要知道,基本没用。这个应该是编译器预保留给进程的普通变量空间,用&、*都可以操作。
6.内存地址无法预先得知,但不会是对齐的。“连续”也是看其他变量和编译器的,甚至是具体运行空间,基本上不会是连续的,不过基本上4个字符串应该是连的(可以在程序中用&、*取出来自己试),和指针数组不大可能是连的。
7.“定义 char a[N][M] {。。。} 还是 char* a[N]”,看具体情况,如果需要改变字串内容还是前面的好(后面的应该也面前可以,用*、&取出来自己试吧),而且前者操作更方便;后面的对于代码紧凑易读、内存不浪费更好些(前者要有内存浪费,我推荐后者)。
8.xxyyboy(壮志凌云)说“硬件本身对char占用的空间可能不同”,据我所知,没这种可能(char就表示ASC字符,表达起来就是8bit,而基本上现代机都是1字节最小单位,不会表达成字什么的,c语言里用宏来对齐硬件不同造成的麻烦也是基于此)。int一类的变量的确依靠硬件甚至是编译器。
KenYuan2016 2007-08-20
  • 打赏
  • 举报
回复
更正一下
考虑到硬件本身对char占用的空间可能不同,至少目前我遇见的都相同,char是类型中最小的,占1个字节。

4*sizeof(char*) + sizeof(char)*(strlen(a[0])+strlen(a[1])+strlen(a[2])+strlen(a[3]))
linxy2002 2007-08-20
  • 打赏
  • 举报
回复
int len = 0;
for(int i=0; i<4; ++i)
{
len += strlen(a[i]);
}

scholar165 2007-08-20
  • 打赏
  • 举报
回复
应该是16个字节吧.
因为里面的每一个元素都是指针.
linhong34 2007-08-18
  • 打赏
  • 举报
回复
就4个指针大小,数组中存放的是地址
食人族哲学家 2007-08-18
  • 打赏
  • 举报
回复
我不信sizeof(a)的结果会是楼上各位说的,我来试着回答一下:
1.sizeof(a)是char**的大小,因为这是个指向char*的数组,a自然就是char**的了(具体的还有点差别,指针和数组还不是一回事);
2.jxlczjp77() 给的是问题本身的答案,正确,不多说了;
3.有人说再加上4个串的大小,那就不是数组本身的大小了,而是所涉及到全部所占的内存大小了.他们这样回答的意思大概是因为错误理解了问题或者是担心提问的/楼主没有把问题表达清楚,是这个语句一共用了多少内存.
4.回答就是4个串的大小,那我估计就挨不上边了,这没关系啊.
Vitin 2007-08-18
  • 打赏
  • 举报
回复
数组本身的大小是 sizeof(a) = 4*sizeof(const char*) 没错。

LZ可能想知道各元素实际使用的内存和,那么还需加上 strlen(a[0]) + 1 + strlen(a[1]) + 1 + strlen(a[2]) + 1 + strlen(a[3]) + 1
missilery 2007-08-18
  • 打赏
  • 举报
回复
zerglarva_aahha可以给满分!
whati 2007-08-18
  • 打赏
  • 举报
回复
可能是我没表达清楚
我想问的是 这个语句一共用了多少内存. char* 数组,方4个指针,没个指针指向一个字符窜,

那么是不是内存就是 4个指针 + strlen(i)i是4个字符窜?

而且字符串的内存地址是属于常量字符串空间?还是堆的?
这些字符窜内存地址又是怎么安放的,连续的?是按最长一个对齐的?别的?
因为有些代码一个字符窜表 有上万项,而且字符串长短不一。我想了解这些内存的情况!
比如我定义 char a[N][M] {。。。} 还是 char* a[N]好呢?
我所考虑的比你们上面大都数人说的可深入多了。
我想肯定有过来人为这个问题疑惑过。
HelloDan 2007-08-18
  • 打赏
  • 举报
回复
jxlczjp77() 高见啊。
lenreyice 2007-08-18
  • 打赏
  • 举报
回复
sizeof (a) 4个指针,返回是4*sizeof(int)的大小;之后占内存要看的,如果是lz那样的常量的话是直接嵌在代码中的,一般不用去算内存。
zhzhxia 2007-08-18
  • 打赏
  • 举报
回复
jxlczjp77正解
nkinuyasha 2007-08-17
  • 打赏
  • 举报
回复
原来我理解错了 听了jxlczjp77 的一席话 才走出误区
rsp19801226 2007-08-17
  • 打赏
  • 举报
回复
为什么这么简单的问题还老问啊?如楼上所说就是16个字节。
jxlczjp77 2007-08-17
  • 打赏
  • 举报
回复
晕啊!!
不要被初始化时的那一堆字符串迷惑了,a是只不过是一个指针数组,每个内容都是一个指向字符串的指针,每个指针占4个字节,一共是4个指针,不是十六个字节是嘛。那一堆字符串并没有存在数组a中,a村的是他们的地址。

就像你有四个口袋,每个口袋放了你一栋房子的地址(有钱人)一样,你知道这个房子在哪,但是你也不用把房间天天带在身上啊(就是想带也装不下)
我啃 2007-08-17
  • 打赏
  • 举报
回复
搞清楚什么叫数组占用的内存之后再回来问吧~
nkinuyasha 2007-08-17
  • 打赏
  • 举报
回复
就可以直接sizeof(a) 因为二维数组在内存中就是一维数组的存放方式,数据是连续存放
所以结果是16,因为每个字符串结尾还包括一个'\0'字符

在VC6.0下通过
加载更多回复(14)

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧