我正在尝试使用指针。我最初创建了一个指向字符的指针,并为该指针分配了 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/