社区
C语言
帖子详情
问个小问题
djh512
2012-01-02 11:53:36
char p[]={'a','e','r'};
char q[15]={'a','e','r'};
printf("p=%d\nq=%d\n",strlen(p),strlen(q));
VS2008下输出的是15,3
问下15是怎么来的,
size_t strlen_a(const char * str) {
size_t length = 0 ;
while (*str++ )
++ length;
return length;
}
第一个为什么不是6呢?
...全文
141
16
打赏
收藏
问个小问题
char p[]={'a','e','r'}; char q[15]={'a','e','r'}; printf("p=%d\nq=%d\n",strlen(p),strlen(q)); VS2008下输出的是15,3 问下15是怎么来的, size_t strlen_a(const char * str) { size_t length = 0 ; while (*str++ ) ++ length; return length; } 第一个为什么不是6呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
JackBurd
2012-01-08
打赏
举报
回复
7L的应该是printf("p[%d] = %d\n\n",strlen(p),*(p + strlen(p)));
zhusizhi007
2012-01-08
打赏
举报
回复
如果是全局变量或是静态变量,则不一样,由各编译器自己决定,但是单个数组必须保证是连续的,数组连续是很多算法高效的基础,如果不连续,绝大部分程序要崩溃,但是对于两个数组之间的布局,则没有要求...
zhusizhi007
2012-01-08
打赏
举报
回复
注意,在局部变量中,是分配在栈中的,而栈是从上往下生长的,strlen的计算则是从下往上走的,C语言标准中,数组必须是连续的,所以
char p[]={'a','e','r'};
char q[15]={'a','e','r'};
在内存中的布局,p的地址更大,q的地址更小,strlen(p)时,根本不会走到q的结束符处,而是往上走到null处结束
JackBurd
2012-01-08
打赏
举报
回复
我在VC++6.0运行结果为7,3,很不借啊。。。
JackBurd
2012-01-08
打赏
举报
回复
我在VC++2005 下的运行结果为7,3,很不解啊。
牛逼代码
2012-01-03
打赏
举报
回复
向2楼学习
iamnobody
2012-01-03
打赏
举报
回复
[Quote=引用 3 楼 djh512 的回复:]
可是结果一直是15,3
不是随机的
这两个数组的分配位置不是连续的么?不是应该连续往下找么?
[/Quote]
根据C语言标准:
两个连续定义的变量所占的内存不要求续.
所以不同编译器有不同的实现.不是随机的是因为你的编译器在你的不变设置的设置的情况下生成了相同的代码,所以都是15;
不必换一个编译器来试,换一个release状态,你就会发现不同.
绿野耕夫
2012-01-03
打赏
举报
回复
[Quote=引用 3 楼 djh512 的回复:]
可是结果一直是15,3
不是随机的
这两个数组的分配位置不是连续的么?不是应该连续往下找么?
[/Quote]
C语言哪条标准规定了这2个数组分配的位置必须是连续的?
djh512
2012-01-03
打赏
举报
回复
可是结果一直是15,3
不是随机的
这两个数组的分配位置不是连续的么?不是应该连续往下找么?
ProgrammingRing
2012-01-03
打赏
举报
回复
[Quote=引用 2 楼 mingliang1212 的回复:]
char p[]={'a','e','r'};//这里没有结束符'\0';strlen就会一直往后找为'\0'的字符(已经访问越界,结果不能确定)
char q[15]={'a','e','r'};//'r'之后的元素没有显式初始化,被始化为'\0',所以很幸运的,这个可以得到正确的结果..
[/Quote]
嗯。。复习了。。
ccnunlp
2012-01-03
打赏
举报
回复
2楼兄台说得很对
new_buffer
2012-01-03
打赏
举报
回复
char p[]={'a','e','r'};
char q[15]={'a','e','r'};
printf("p address:0x%x\nq address:0x%x\n\n",p,q);
printf("p = %s\nq = %s\n\n",p,q);
printf("p[%d] = %d\n\n",strlen(p) - 1,*(p + strlen(p)));
printf("p=%d\nq=%d\n",strlen(p),strlen(q));
你运行下这段代码就知道了。。。字符串结束符是NULL,也就是 0
AnYidan
2012-01-03
打赏
举报
回复
试试
char p[]={'a','e','r'};
char q[15]={'a','e','r'};
int main()
{
printf("p=%d\nq=%d\n",strlen(p),strlen(q));
system("pause");
return 0;
}
氰客
2012-01-03
打赏
举报
回复
strlen() 是判断字符串长度的吧。字符串以'\0’结束
iamnobody
2012-01-02
打赏
举报
回复
char p[]={'a','e','r'};//这里没有结束符'\0';strlen就会一直往后找为'\0'的字符(已经访问越界,结果不能确定)
char q[15]={'a','e','r'};//'r'之后的元素没有显式初始化,被始化为'\0',所以很幸运的,这个可以得到正确的结果..
【Java】题目:古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
需求: 题目:古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析: 这是一个斐波那契数列数列
问题
同样,它的突破口在三个月之后开始,界定第一个月数目为1,第二个月也是1,从第三个月开始计算第一次出生的兔子数 月份 对数 1 1 2 1 3 2 4 ...
古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
题目:古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 第一个月-----------------1 第二个月-----------------1 第三个月-----------------2 第四个月-----------------3 第五个月---------------
数学
问题
1 - 两个圆圈,小圆贴着大圆外部转过一圈,问小圆转几圈
1个小圆半径1,1个大圆半径3,小圆绕着大圆转1圈,问小圆自转几圈 设小圆半径为r,以大圆圆心为观察点,小圆的圆心绕过了距离S = (1+3)πr = 4πr, 则自转圈数Rotation= S/2πr =4 圈 视觉实现: https://www.geogebra.org/m/v3a437ux 参考:https://math.stackexchange.com/questions/135105...
Java利用for循环解决搬砖
问题
36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女和小孩各若干?
搬砖
问题
实际上与“百钱买百鸡”如出一辙,只是数字发生了变化而已。 详细解答“百钱买百鸡”
问题
请点击下方链接(详细到每一个小细节) “百钱买百鸡”详解 36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女和小孩各若干? 直接贴代码: /**36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女和小孩各若干? * 此题和“百钱买百鸡一个解法,基本...
古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
古典
问题
:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 由题意分析得:第一个月有一对兔子,第二个月还是一对,到了第三个月兔子生出一对鸽子,此时有两对,到了第四个月第一个月的兔子又生一对兔子所以第四个月有3对兔子,到了第五个月第一、二个月的兔子又各生一对,所有第五个月有5对兔子,以此类推到了第六个月共有8对兔子
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章