c++ - 为什么声明为指向字符的指针并分配了 2 个字节大小的 String 的大小会被更改?

标签 c++ c string pointers memory-management

我正在尝试使用指针。我最初创建了一个指向字符的指针,并为该指针分配了 2 个字节的大小。然后我运行循环直到 1000 分配一些值。当我尝试打印字符串时,它给了我一整套已分配的值。

#include <iostream>
#include <string.h>

using namespace std;


int main()
{
    char *a = (char *)malloc(2);
    for (int i=0;i<10;i++)
       a[i]='a';
    cout<<a<<"\t"<<strlen(a)<<"\n";
    return 0;
}

输出如下

aaaaaaaaaa    10

我在 C 和 C++ 中运行了相同的代码。他们给了我同样的结果。

首先想到的是,由于我使用了指针,a[3] 意味着 *(&a + 3): 这可以解释为什么我能够为该位置分配一个值。但是,即使我只为字符串分配了两个字节的内存,为什么我的字符串长度会发生变化?为什么编译器的行为方式不同?屏幕后面有什么?

操作系统:OS X 10.10.0 编译器:gcc ||克++ 架构:64位架构

编辑1:这与段错误无关。

Edit2:如果是因为strlen读取直到遇到空终止符。我还没有在字符串末尾声明它。

最佳答案

此代码在内存使用方面存在问题。仅分配了 2 个字节的内存,但使用了 10 个字节。这将导致内存损坏。 那么行为是未定义的。

  for (int i=0;i<1 /*10*/;i++)

在您的情况下,最大 i 值可以是 1 而不是 10。剩余的 1 个字节用于 \0 字符。

关于c++ - 为什么声明为指向字符的指针并分配了 2 个字节大小的 String 的大小会被更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26793242/

相关文章:

c - 在 mac 中使用 Carbon Framework 检测双显示器/显示器?

ruby-on-rails - 如何将整个单词与 Aho corasick 匹配?

python - 字符串递归问题

c++ - 使用 openGL 的多纹理映射

c++ - operator new 如何调用类的构造函数?

c - 检查所有 int 数组元素是否等于特定数字的最短代码?

C 链接库错误

python - Python 上的正则表达式在使用 char 类时打印垃圾

c++ - 查找文件中包含其本身及其反转的单词

c++ - 在没有事先声明的情况下错误使用枚举?