如何为char*分配内存而不显式分配

如何为char*分配内存而不显式分配,c,pointers,C,Pointers,在下面的(合法)c代码中,没有显式分配给指针p的内存 好吧,如果不明确分配内存,我就无法让int*p指向值5 int main() { char *p; p = "Hello"; return 0; } char*指针有何不同 为“Hello” p指向字符串literalHello,其中内存是从只读数据段分配的。当你修改它的时候,你会得到一个未定义的行为,可能会导致分割错误 Cstandard说 字符串文字-普通字符串文字具有“n常量字符数组”类型和静态存储持续时间(

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

好吧,如果不明确分配内存,我就无法让
int*p
指向值
5

int main()
{
    char *p;
    p = "Hello";
    return 0;
}
  • char*
    指针有何不同
  • “Hello”

p
指向字符串literal
Hello
,其中内存是从只读数据段分配的。当你修改它的时候,你会得到一个未定义的行为,可能会导致分割错误

C
standard说

字符串文字-普通字符串文字具有“n常量字符数组”类型和静态存储持续时间(3.7)


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

分配时:

p="Hello";
编译器获取数据段中字符串文本的地址,并将其放入指针变量p中

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

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

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

实际上,您想将数字5存储到p所指向的位置(在本例中未定义,因为我们从未将p设置为任何值)。你可能会犯错误

如果您尝试这样做:

int *p;
p = 5;
您将告诉编译器要做的是将值5转换为指向整数的指针,并将其存储在p中,结果指针p现在指向地址5。你可能会得到这样的警告:

t.c:7: warning: assignment makes pointer from integer without a cast

换言之,您正在尝试将整数转换为指针-可能不是您所想的那样。

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

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

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

  • 通过
    char*p,您定义了指针变量,编译器将分配必要的内存来存储此变量。但在这一次,这个指针还没有初始化,所以它没有一个确定的值,这意味着它可以指向任何地方

  • 通过像
    p=“Hello”这样的语句
    ,您为指针
    p
    分配了一个值,现在它指向某个确定的内存地址,这个内存分段可以由编译器分配,也可以由您自己分配,例如
    p=malloc(…)


  • 这些工作是由编译器为您完成的。它在数据段中分配空间,存储字符串“Hello”,并将此数组的基址分配给指针(在您的示例中为p1)

    但是,这个数组“Hello”将是一个常量数组。创建数据后,您将无法修改数据


    如果试图修改数据,则会得到意外的结果

    据我记忆所及,该字符串位于堆的静态部分。如果你操纵了这个刺痛,你会自动处理一个复制品,可能是@arjunseredharan的复制品,更新了一些信息,希望能帮助你理解
    t.c:7: warning: assignment makes pointer from integer without a cast