C#中如何输出字符串的地址及占用内存大小

ysd_xwl 2010-03-14 01:43:45
C#中如何输出字符串的地址及占用内存大小,比如str="hello!",怎样输出str的地址,能否输出每一个字符的地址,怎样求出str占用内存的大小?像C语言中那样。
...全文
1939 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2010-03-15
  • 打赏
  • 举报
回复
再贴一段MSDN的原话:
引用
在 .NET Framework 中,String 对象可以包含嵌入的 null 值,这些值将算作字符串长度的一部分。但是,在某些语言(例如 C 和 C++)中,null 字符指示字符串的结尾,将不被视为字符串的一部分,并且将不算作字符串长度的一部分。这意味着当应用于 String 对象时,C 和 C++ 程序员或使用 C 或 C++ 编写的库对字符串作出的下列常规假设不一定有效:

strlen 或 wcslen 函数返回的值不一定等于 String..::.Length。

由 strcpy_s 或 wcscpy_s 函数创建的字符串不一定与通过 String..::.Copy 方法创建的字符串相同。

应确保对 String 对象进行实例化的本机 C 和 C++ 代码以及通过平台调用传递 String 对象的代码不假设使用嵌入的 null 值标记字符串的结尾。
qldsrx 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ysd_xwl 的回复:]
继续请教一下,C#中一个字符占两字节,string中的一个字符到底占一字节还是两字节,它也像C语言中是以'\0'作为结束标志吗?非常感谢!
[/Quote]
为什么不看下MSDN呢,那上面写得很清楚的,并没有提到“以'\0'作为结束标志”。

string 类型表示零或更多 Unicode 字符组成的序列。
yyz985 2010-03-14
  • 打赏
  • 举报
回复
但是每一个字符所在的地址是可以直接获取的。
&str[index]
yyz985 2010-03-14
  • 打赏
  • 举报
回复
托管字符串是不可获取一个地址的
它可能是几块不连续内存构成(现在这么设计或将来会这么优化)。

所以托管string调用API时都会被要求序列化到固定的缓冲区
xingyuebuyu 2010-03-14
  • 打赏
  • 举报
回复
string中一个中文字符是占两个字节的,string.Length是字符的长度,并不是所有字符的字节长度.
它也是以'\0'作为结束标志

http://msdn.microsoft.com/zh-cn/library/system.string(VS.80).aspx
ysd_xwl 2010-03-14
  • 打赏
  • 举报
回复
继续请教一下,C#中一个字符占两字节,string中的一个字符到底占一字节还是两字节,它也像C语言中是以'\0'作为结束标志吗?非常感谢!
welcomechenqi 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xingyuebuyu 的回复:]
string str="hello!";
int i=System.Text.Encoding.Default.GetByteCount(str);

i就是str占用内存的大小,单位是byte.

至于内存地址,你看下面的讲解,内存地址是没有意义的,因为你修改string,它返回的是一个新的string对象,原来的是不变的
http://terrylee.cnblogs.com/ar……
[/Quote]

string类型不是引用类型的么??
wuyq11 2010-03-14
  • 打赏
  • 举报
回复
string str = "";
GCHandle gch = GCHandle.Alloc(str, GCHandleType.Pinned);
{
int ptr = gch.AddrOfPinnedObject().ToInt32();
}
gch.Free();

Optione 2010-03-14
  • 打赏
  • 举报
回复
Try:

string a = "hello!";
unsafe
{
fixed (char* p = a)
{
Console.WriteLine("Ptr: " + ((int)p).ToString());

Console.WriteLine("Len: " + (*((int*)p - 1) & 0x3fffffff).ToString());
}
}
xingyuebuyu 2010-03-14
  • 打赏
  • 举报
回复
string str="hello!";
int i=System.Text.Encoding.Default.GetByteCount(str);

i就是str占用内存的大小,单位是byte.

至于内存地址,你看下面的讲解,内存地址是没有意义的,因为你修改string,它返回的是一个新的string对象,原来的是不变的
http://terrylee.cnblogs.com/archive/2005/12/26/304876.aspx
qldsrx 2010-03-14
  • 打赏
  • 举报
回复
string str = "hello!";
//获取大小
int size = str.Length * 2;//内存中肯定是Unicode存放的,所以占用的内存为字符串长度乘以2
GCHandle handle = GCHandle.Alloc(str, GCHandleType.Pinned);
//获取地址
IntPtr address = handle.AddrOfPinnedObject();

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧