为什么char * c可以在没有分配或引用的情况下分配字符串?

时间:2013-10-27 20:20:21

标签: c++ c

char * c = "world"; // works fine 

int * p = 10; // throws an error

需要像

那样完成
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(*int)); // in C

如果要将指针分配给某个内存,或者它应该引用某个地址,那么为什么字符串可以存储在字符指针中而不为其分配内存,为什么不是整数数据类型呢?

3 个答案:

答案 0 :(得分:2)

C和C ++碰巧提供字符串文字的语法,用于创建具有指定初始值的char类型的数组值。

在C中,字符串文字"world"的类型为char[6](字符串长度为5,终止'\0'为1)。在C ++中,它的类型为const char[6]。差异是出于历史原因;在任何一种语言中,字符串文字应始终被视为只读。

与数组类型的任何表达式一样,它在大多数上下文中被隐式转换为指向其第一个元素的指针。这就是为什么

const char *c = "world";

有效。字符串文字"world"本身创建一个数组对象,初始化使c指向数组对象的第一个元素。

没有用于创建int类型对象的内置语法。

嗯,实际上有。 C99添加了复合文字,让你写:

int *p = (int[]){ 10 };

创建类型为int[1]的数组对象,具有与int*相同的隐式转换。 (C ++没有这个特性。)(数组对象的生命周期取决于它出现的上下文;如果它在函数体内,当封闭块完成时,数组不再存在。字符串文字,另一方面手,具有静态存储持续时间并且存在于整个程序执行中。)

顺便说一下,这个:

int * p = (int*) malloc(1 * sizeof(*int)); // in C

不正确;你想要int*,而不是*int。但最好写成:

int *p = malloc(sizeof *p));

在C中不需要转换malloc的结果,并且在某些情况下可以隐藏错误。使用sizeof *p可以使代码更健壮;如果您稍后将pint*更改为double*,则只需在一个位置更改类型。

答案 1 :(得分:1)

因为根据定义,字符串文字的类型为char*,指向字符串第一个字符的指针。

答案 2 :(得分:1)

指针变量应存储地址。

char * c = "world"; // works fine

因为"world"在程序的只读块中分配了内存,因此"world"得到了一些地址,这个地址存储在指针c

int * p = 10; // throws an error

因为10是常量整数并且尚未分配任何内存,因此它没有地址。我们不能在指针10中存储常量p,因为它不是地址。

这就是为什么我们这样做

int * p = new int(10); // in C++

int * p = (int*) malloc(1 * sizeof(int)); // in C

这会将值10的内存分配给整数,并且该整数的地址存储在p中,这是正确的