中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
空间长度的问题!!!
作者:未知 时间:2005-09-13 19:23 出处:ChinaUnix.net 责编:chinaitpower
              摘要:空间长度的问题!!!

请问:怎样打印指针变量指向的空间的长度???
例:

char str[10];
char *p;

p=str;

printf("the len of p is %d \n",sizeof(??));

 穷惯了 回复于:2003-07-07 15:01:09
printf("the len of p is %d \n",strlen(p));

 boylitao 回复于:2003-07-07 15:34:35
printf("the len of p is %d \n",strlen(p));

这个也打不出来,而且会coredump

 gadfly 回复于:2003-07-07 15:41:18
如果你是要字符串长度,用strlen,但是这个指针必须初始化过的,否则会core dump。

如果你需要数组的空间大小,用sizeof(str)。str必须是数组变量。用指针是没有用的,返回的是固定的大小。

 boylitao 回复于:2003-07-07 15:47:16
同意!
所以,我想知道又没有方法得出指针变量指向的空间的长度,不一定用sizeof函数

 lenovo 回复于:2003-07-08 00:25:11
[quote:db79393500="boylitao"]同意!
所以,我想知道又没有方法得出指针变量指向的空间的长度,不一定用sizeof函数[/quote:db79393500]     
有呀,你可以自己写一个。:)

 jobman 回复于:2003-07-08 03:21:18
正因为是指针,所以,他指向什么,你必须非常确定
在传递给你一个指针后,你必须明确知道他指向什么,否则
没有什么办法能自动获知指针指向的变量类型,指针是非常
灵活的,可是,正因为它指向目标的不确定性,所以也很危险,
例如:

auto_type(  void * p 
{
 你能在这里分辨是谁吗;肯定不能,      
}

struct ccsv1
{
     int i;
    int j;
} csv1;
struct ccsv2
{
    char p[100];
    long ll;
} csv2;

auto_type( &csv1 ;
auto_type( &csv2 ;

 boylitao 回复于:2003-07-08 08:54:27
请教lenovo  ,怎样写!!
例:
 

 boylitao 回复于:2003-07-08 08:57:09
char *p;

p=(char *)malloc(100);

我怎么确认p确实指向了100大小的空间。
当然可以看返回是否为NULL,但是怎么从直观上看出,如打印出其长度

 jobman 回复于:2003-07-08 13:08:03
如果你使用 malloc , 那完全可以获得大小,不过于具体
平台关系很大。

 boylitao 回复于:2003-07-08 15:25:32
无论什么平台,你能举出例子吗!~

 boylitao 回复于:2003-07-08 17:26:17
还有没有高手能解决!!
最好是有代码,理论的就算了

 liupch 回复于:2003-07-08 17:43:24
如果P指向了一段内存,你根本无法知道它指向的长度是多少。因为就算你使用malloc申请了100byte内存,然后让P指向这100字节首地址。但是如果你打印printf("%c",*(p+120));也是不会错的。

C语言不是java,如果你使用了未申请的内存,有可能会产生错误,也有可能不会产生错误。这要看你使用的这些未申请的内存是否被其他程序占用。所以C语言要求编程序的人要小心使用指针。

 jobman 回复于:2003-07-09 02:15:40
你可以考虑, 既然用 malloc 申请的内存块可以通过 free 释放,
那么, 他一定有一种机制来记录分配的内存块大小, 以下是几个测试,
如果你从malloc 申请返回的指针向前读, 就是这个内存块的大小,
当然这跟系统密切相关,不通的环境差异巨大,所以需要及其小心,
这个方法没有任何保障,他只能用于malloc返回的内存块,c++的
new不能这样做, 

     1
     2  #include <stdio.h>
     3  #include <malloc.h>
     4
     5  main( 
     6  {
     7      char * p;
     8      long    size = 0;
     9
    10      p = (char*)malloc( 65536 ;
    11      if( p 
    12      {
    13          memcpy( &size, p - sizeof(long), sizeof(long) ;
    14          printf( "size=%ld\n", size ;
    15      }
    16  }

编译:
-apps>> cc -o mm mm.c

测试1:
book.SCO:apps> uname -a
SCO_SV book 3.2 5.0.5 i386
book.SCO:apps>
结果:
book.SCO:apps> ./mm
size=65537
book.SCO:apps>
测试2:
[admin@linux test]$ uname -a
Linux linux 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
[admin@linux test]$
结果:
[admin@linux test]$ ./mm
size=65545
[admin@linux test]$
测试3:
-apps>> uname -a
OSF1 btds10 V5.0 1094 alpha
-apps>>
结果:
-apps>> ./mm
size=-65568
-apps>>
可以看到, sco和linux结果相近,可能他们都比较靠近 sysv 的缘故,
实际上, 他们都分配了 0x11000 的内存块, sco多了1字节,linux
多了9字节, 这是对齐的需要;
测试3是在由 DEC研发,后 COMPAQ购并,现在归了HP 的alpha平台tru64 v5.0
上进行的,他是一个全64bit操作系统, 他本身的内存分配算法很复杂,
同时寻址能力也大, 所以在内存分配上比较讲究, 在分配小尺寸内存和
大尺寸内存时有不同的策略. 这个方法没有任何承诺,也就是你要承担
某一天可能失效的后果,请慎重,嘿嘿.

 boylitao 回复于:2003-07-09 09:01:31
非常感谢jobman的解答,我去试试!!
这个问题的难度在于liupch   所讲的“你使用了未申请的内存,有可能会产生错误,也有可能不会产生错误”

 boylitao 回复于:2003-07-09 09:41:48
我的结果是:
$ a.out
sizeof(long) is [4]size=65545
$ uname
HP-UX
jobman这一句:memcpy( &size, p - sizeof(long), sizeof(long) 
什么意思?????
谢谢!!

 boylitao 回复于:2003-07-10 09:01:34
我查了一下,free的源代码,这个函数是利用一个指向内存块的块号寻找此内存块的,那个函数在接口里没有,恐怕不能用free的方法了

 kaleio 回复于:2003-07-10 10:07:40
楼上的,jobman的“如果你从malloc 申请返回的指针向前读, 就是这个内存块的大小, ”,就是“memcpy( &size, p - sizeof(long), sizeof(long) ; ”的解释

 boylitao 回复于:2003-07-10 13:03:16
i know
thank you!!!

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有