在以下(合法)c代码中,没有明确分配给指针p的内存。
AFAIK,在没有明确分配内存的情况下,我无法让int *p
指向值5
。
int main()
{
char *p;
p = "Hello";
return 0;
}
char*
指针不同"Hello"
答案 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
的指针。
在运行时,字符串文字通常位于某些只读内存分段中。
顺便说一下,看起来你混淆了指针变量和指针变量所指向的地址。
通过像char *p;
之类的语句,您定义了一个指针变量,编译器将分配必要的内存来存储此变量。但是在这个时候,这个指针还没有被初始化,所以它没有一个确定的值,这意味着它可以指向任何地方。
通过类似p = "Hello";
的语句,您为指针p
分配了一个值,现在它指向一些确定的内存地址,这个内存分段可以由编译器分配,或者由您自己分配,例如p = malloc(...);
。
答案 3 :(得分:0)
作业是由编译器为您完成的。它在数据段中分配空间并存储字符串" Hello"并将此数组的基址指定给您的情况下的p1指针。
然而这个阵列"你好"将是一个const数组。创建数据后,您将无法修改数据。
如果您尝试修改数据,那么您将获得意外结果。