问个小问题

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呢?
...全文
127 16 打赏 收藏 转发到动态 举报
写回复
用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',所以很幸运的,这个可以得到正确的结果..

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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