这两个指向char初始化的指针之间的区别

时间:2014-02-20 11:17:13

标签: c

我知道之前已经回答了,但我找不到问题 这两个初始化之间有什么区别:

int main() 
{
    char* pch1;
    char* pch2;

    pch1 = (char*)malloc(sizeof(char) * 5);
    strcpy(pch1, "Text");

    pch2 = "Text";
}

4 个答案:

答案 0 :(得分:2)

这里有三个主要区别:

  • 第一个将字符串文字的内容复制到动态内存中,而第二个直接指向该文字。
  • 修改pch1字符串是合法的;修改pch2字符串是非法的
  • 您需要释放pch1以避免内存泄漏。

为了完整性,请考虑pch3,其初始化如下:

char tmp[] = "Text";
char *pch3 = tmp;

pch3可以像pch1一样修改,但不需要释放,因为字符串的内容会被复制到自动内存中。

答案 1 :(得分:2)

首先:不要从malloc转换返回值 - 这是常见的错误来源。 Do I cast the result of malloc?

pch1 = malloc(sizeof(char) * 5);

指定一个指向堆上5个字节的动态分配块的指针。

pch2 = "Text";
理想情况下应该避免使用

,因为它会指定一个指向字符串文字的指针。字符串文字在大多数操作系统上是只读的,也是错误的常见来源。如果你这样做,你应该指向const

const char * pch2 = "Text";

答案 2 :(得分:1)

pch1指向堆

您可以在bounderies中修改

加上必须释放

其他指向静态数据段 您无法修改

答案 3 :(得分:0)

  1. pch1将使用堆内存来存储您的数据
  2. pch2 - 使用堆栈内存