#include<stdio.h>
#include<string.h>

int main()
{
    char * p = "abc";
    char * p1 = "abc";
    printf("%d %d", p, p1);
}

当我打印两个指针的值时,它打印的是相同的地址.为什么?

推荐答案

具有相同内容的两个不同字符串文字是放在相同的内存位置还是放在不同的内存位置取决于实现.

您应该始终将pp1视为两个不同的指针(即使它们具有相同的内容),因为它们可能指向或可能不指向同一地址.你不应该依赖于编译器优化.

C11 Standard, 6.4.5, String literals, semantics

未指定这些数组是否是不同的,只要它们的 元素具有适当的值.如果程序试图 修改这样的数组,行为未定义.


打印格式必须为%p:

  printf("%p %p", (void*)p, (void*)p1);

参见this answer了解原因.

C++相关问答推荐

FFmpeg不检测比特流过滤器参数

如何解决C中的严格别名?

使用双指针动态分配和初始化2D数组

为什么我不能只在内存地址中添加一个int来寻址任何数组?

将 struct 传递给函数

Kdb:仅升级指定的列

为什么此共享库没有预期的依赖项?

为什么指针运算会产生错误的结果?

通过描述符查找文件路径时出现问题

不同原型的危险C函数是可能的

-Wnonnull-Compare警告不是具有误导性吗?

C标准关于外部常量的说明

从BIOS(8086)中读取刻度需要多少?

在C中使用无符号整数模拟有符号整数

挥发性语义的形式化理解

如何打印循环调度问题的时间表

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

在C中使用字符串时是否不需要内存分配?

函数指针作为函数参数 - 应该使用 const 吗?

C Makefile - 如何避免重复提及文件名