c - printf 两个指针的地址算术

标签 c pointers

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 不是

最佳答案

当您打印像ps 这样的指针时,请使用%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/

相关文章:

c - 读取C中缓冲区的特定部分

c - malloc 在函数调用之间保留值

C指针错误值?

c++ - 函数指针寻址具有多个参数的函数

c++ - std::string 的对象真的可以 move 吗?

c - 在c++上使用fifo算法开发缓存模拟器的好方法

c - 标准行为与 gcc 版本有关吗?

c - 在一个 C 文件中运行四个简短且独立的程序

c - C中数组排序算法中的段错误

C++ 指针引用、类和指针列表、奇怪的返回