在以下(合法的)c 代码中,没有显式分配给指针 p 的内存。

AFAIK,如果没有显式分配内存,我无法让 int *p 指向值 5

int main()
{
    char *p;
    p = "Hello";
    return 0;
}
  • char* 指针如何不同
  • "Hello"
  • 分配的内存在哪里

    最佳答案

    当您在程序中放入诸如“Hello”之类的文字字符串时,编译器会在程序的数据区(称为 Data Segment )中创建一个字符数组。

    当您分配:

    p="Hello";
    

    编译器获取数据段中字符串文字的地址并将其放入指针变量 p 中。

    请注意,字符串文字与数字文字不同。字符串文字的类型是 const char[] - 您可以将其分配给 char* 指针。整数文字只是类型 int

    另请注意,数字文字不需要存储在数据段中 - 在大多数情况下,此类文字直接放置在机器代码指令中。因此,没有您可以将 p 指向的地址。

    如果您尝试这样做(根据您的评论):
    int *p;
    *p = 5;
    

    你实际上是说你想将数字 5 存储到 p 指向的位置(在这种情况下这将是未定义的,因为我们从未将 p 设置为任何东西)。您可能会遇到段错误。

    如果您尝试这样做:
    int *p;
    p = 5;
    

    您要告诉编译器做的是将值 5 转换为指向整数的指针并将其存储在 p 中,结果指针 p 现在指向地址 5。您可能会收到如下警告:
    t.c:7: warning: assignment makes pointer from integer without a cast
    

    换句话说,您正在尝试将整数转换为指针 - 可能不是您认为自己想要做的。

    关于c - 内存分配如何在不显式分配的情况下为 char* 工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22242794/

    10-13 06:28
    查看更多