【问题标题】:Why char* and int* behaves differently [closed]为什么 char* 和 int* 的行为不同[关闭]
【发布时间】:2013-11-06 07:59:46
【问题描述】:

下面给出的程序有一些疑问。任何讨论都将有助于了解内部结构。

#include <iostream>
using namespace std;

int main() {
    // your code goes here

    char* ptr = new char[11];
    ptr = "helloworld";
    cout << ptr;

    int* ptr1 = new int[2];
    //ptr1 = {12, 24};
    cout << ptr1;

    return 0;
}
  1. cout
  2. 自从 cout
  3. 如果 ptr = "helloworld";被允许。为什么 ptr1 = {12, 24};不允许吗?

【问题讨论】:

  • 1.因为const char * 有一个单独的重载,因为它通常表示字符串。 2.投到(void *)。 3. 因为标准是这样说的。
  • ptr = "helloworld"; 也是不允许的,因为ptrchar*
  • @Nawaz 为什么不允许。 ptr 是 char*,而“helloworld”是 char 数组,那么有什么问题呢?你可以在这里查看。 ideone.com/QsqKrN 允许。
  • @DeveshAgrawal 字符串文字是 const char 的数组。
  • @nawaz 如果我没记错的话 char* ptr 被视为 const char* ptr。如果不是,那么我会将 char* ptr 设为 const char* ptr。那它就被允许了吧?

标签: c++ pointers char int


【解决方案1】:

您问题的核心是为什么

我可以看到您对编译器处理您的源代码的方式也有些困惑。考虑:

char* ptr = new char[11];
ptr = "helloworld";

此代码分配 11 个字符的内存并将 ptr 设置为该分配的地址。下一行创建一个常量“helloworld”,它被分配和初始化,并将 ptr 设置为该内存的地址。您有两个内存位置,一个有 11 个未初始化的字符,一个初始化为“helloworld\0”。

【讨论】:

  • 非常感谢您的解释。这正是我一直在寻找的:)
【解决方案2】:

您的代码有一个主要问题,那就是内存泄漏。您分配内存并将其分配给ptr,然后您重新分配它以使其指向其他地方。如果你想让内存包含一个字符串,你必须将它复制到分配的内存中。

语言不允许使用“文字数组”,除非在声明中初始化数组。

【讨论】:

  • 虽然这是真的(而且很重要),但它并没有解决上述任何问题。
  • @joachim 是重新分配它以使其指向其他地方吗?是 ptr = "helloworld";不等于 ptr[0] = 'h' ptr[1] = 'e' ptr[2] = 'l' 。 . .
  • @DeveshAgrawal 为什么它是等价的?指针不是数组。
  • 感谢您的回复。所以我想避免 ptr[0] = 'h' ptr[1] = 'e' ptr[2] = 'l' 。 . .那么有没有其他方法,所以我可以一次将“helloworld”存储在分配的内存中??
  • @DeveshAgrawal 那么你想使用std::copy()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多