int strlen(char *s)
{
char *p = s;
while (*p != '\0')
p++;
return (p - s);
}
p-s
给出前进过来的字符数,即字符串长度
当我 printf("%d") p 或 s 我得到大数字(每次我重新编译程序时都是不同的)
这些数字是否与指针的地址相关?单独带有 p 或 s 的 printf %d 是随机高数,但 p-s
不是
最佳答案
当您打印像p
和s
这样的指针时,请使用%p
格式说明符。为了技术上的正确性,也将它们转换为 void *
:
printf("p is %p.\n", (void *) p);
printf("s is %p.\n", (void *) s);
如果使用不匹配的格式说明符进行打印,则行为未定义。
当您打印这些指针的值时,您通常会看到传递给您的函数的字符串开始 (s
) 和结束 (p
) 的地址。 (C 实现需要打印一些表示指针的东西。不需要地址作为简单数字,但常见的 C 实现以十六进制打印地址。)这些值可能很大,因为操作系统,包括程序加载器,分配内存地址空间中的不同位置供您的程序使用。
这些地址可能会有所不同,因为加载程序故意使用随机地址来阻止任何试图利用已知地址来破坏程序的攻击者。 (地址也可能因其他原因而异。)
p-s
是常量,因为您每次都传递相同的字符串,所以它的开始位置和结束位置之间的距离始终相同。
关于c - printf 两个指针的地址算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47534982/