| 穷惯了 回复于: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!!!
|