内存分配如何在没有显式分配的情况下为char *工作

时间:2014-03-07 06:07:27

标签: c pointers

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

AFAIK,在没有明确分配内存的情况下,我无法让int *p指向值5

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

4 个答案:

答案 0 :(得分:6)

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

分配时:

p="Hello";

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

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

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

如果您尝试这样做(根据您的评论):

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

换句话说,您正在尝试将整数转换为指针 - 可能不是您认为的那样。

答案 1 :(得分:1)

p指向字符串文字Hello,其中内存是从只读数据部分分配的。当您修改它时,您将获得未定义的行为,并可能导致分段错误。

C标准说,

  

字符串文字 - 普通字符串文字的类型为“n const char数组”和静态存储持续时间(3.7)

答案 2 :(得分:1)

在C中,像"Hello"这样的字符串文字将被扩展为char *类型的值,即它的基地址,您可以使用它来初始化指向char的指针。

在运行时,字符串文字通常位于某些只读内存分段中。

顺便说一下,看起来你混淆了指针变量和指针变量所指向的地址。

  1. 通过像char *p;之类的语句,您定义了一个指针变量,编译器将分配必要的内存来存储此变量。但是在这个时候,这个指针还没有被初始化,所以它没有一个确定的值,这意味着它可以指向任何地方。

  2. 通过类似p = "Hello";的语句,您为指针p分配了一个值,现在它指向一些确定的内存地址,这个内存分段可以由编译器分配,或者由您自己分配,例如p = malloc(...);

答案 3 :(得分:0)

作业是由编译器为您完成的。它在数据段中分配空间并存储字符串" Hello"并将此数组的基址指定给您的情况下的p1指针。

然而这个阵列"你好"将是一个const数组。创建数据后,您将无法修改数据。

如果您尝试修改数据,那么您将获得意外结果。