user-0 提问: 求一古老指针问题

回复:
user: user-1
content: 引用 9 楼 Ceronjyc 的回复:[quote=引用 4 楼 Adol1111 的回复:] _msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。 你好，我想再寻一问题 void test2() { 	//申请一片内存空间 	char *str = (char*)malloc(13*sizeof(char));  	strcpy(str, "hello world"); 	printf("%s\n", str); 	free(str);  	if(str != NULL) 	{ 		strcpy(str, "hello world");		 		printf("%s\n", str); 	} } 为什么free(str)之后，还能正常输出“hello world” ？free让str不再指向之前申请的内存空间，str变成随机了指向，但为什么strcpy的时候不会报错？[/quote] 这个就是所谓的野指针，空间已经被回收了，但这个指针可不是随机指向，指针的地址还是原来的，不信的话你可以打印试试看。void test2() {     //申请一片内存空间     char *str = (char*)malloc(13*sizeof(char));     printf("%p\n",str);     strcpy(str, "hello world");     printf("%s\n", str);     free(str);     printf("%p\n",str);      if(str != NULL)     {         strcpy(str, "hello world");                 printf("%s\n", str);     } }至于free之后的指针，是否能访问这个就很难说了。有时候可以，有时候不可以。无论系统是否允许，都应该不去访问这种无意义的地址，因为人为的访问一个无效的地址是很危险的。 正确的作法是，在free之后，把这个指针重新指向NULL。也就是：free(str); str=NULL;

user: user-0
content: 引用 4 楼 Adol1111 的回复:_msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。 你好，我想再寻一问题 void test2() { 	//申请一片内存空间 	char *str = (char*)malloc(13*sizeof(char));  	strcpy(str, "hello world"); 	printf("%s\n", str); 	free(str);  	if(str != NULL) 	{ 		strcpy(str, "hello world");		 		printf("%s\n", str); 	} } 为什么free(str)之后，还能正常输出“hello world” ？free让str不再指向之前申请的内存空间，str变成随机了指向，但为什么strcpy的时候不会报错？

user: user-1
content: 引用 5 楼 Ceronjyc 的回复:[quote=引用 4 楼 Adol1111 的回复:] _msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。 万分感谢，要的就是这个_msize()。[/quote] 忘记说了，_msize()不是标准的，linux没有这东西，不过应该有其他的代替函数。

user: user-0
content: 再次感谢两位大哥，很有收获。

user: user-0
content: 引用 1 楼 user-2 的回复:哪里不一样呢？  p[i] = (char *)malloc(i+1); //这里没有清空或者赋值，直接strlen是得不到正确的长度的！ printf("p[%d]:%d\n", i, strlen(p[i]));  懂了，谢谢啊！

user: user-0
content: 引用 4 楼 Adol1111 的回复:_msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。 万分感谢，要的就是这个_msize()。

user: user-1
content: _msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。

user: user-1
content: #include <stdio.h> #include <malloc.h>  void test4() { 	int i; 	char **p  = (char**)malloc(sizeof(char*)*50); 	int sum = 0; 	for(i=0; i<50; i++) 	{ 		p[i] = (char *)malloc(i+1); 		printf("p[%d]:%d\n", i, _msize(p[i])/sizeof(char)); 		sum +=_msize(p[i])/sizeof(char); 	} 	printf("sum: %d\n", sum); 	for(i=0; i<50; i++) 		free(p[i]); 	free(p);//别忘记释放p，它和p[i]两码事 }  int main(void) { 	test4(); 	getchar(); 	return 0; }

user: user-1
content: strlen是计算到第一个'\0'的位置的，你没有指定'\0'在哪里，所以取得的长度是不对的，甚至会超过数组分配的长度所以就错了。 计算内存分配的大小应该用其他方法，改成这种就OK了：printf("p[%d]:%d\n", i, _msize(p[i])/sizeof(char));

user: user-2
content: 哪里不一样呢？  p[i] = (char *)malloc(i+1); //这里没有清空或者赋值，直接strlen是得不到正确的长度的！ printf("p[%d]:%d\n", i, strlen(p[i]));

user: user-0
content: 引用 8 楼 Adol1111 的回复:[quote=引用 5 楼 Ceronjyc 的回复:] [quote=引用 4 楼 Adol1111 的回复:] _msize(p[i])分配的是内存块的大小，所以计算长度的话，还要除以sizeof()求得的保存类型的长度。 还有这里：p[i] = (char *)malloc(i+1);最好改成p[i] = (char *)malloc((i+1)*sizeof(char)); 当然对char来说是无所谓的，因为长度是1。  你之前的char **p  = (char**)malloc(1000);最好也改成我的那种。自己估算的长度是很麻烦的，不如让计算机来计算，你只要指定分配的个数，而不是内存块的大小。 万分感谢，要的就是这个_msize()。[/quote] 忘记说了，_msize()不是标准的，linux没有这东西，不过应该有其他的代替函数。[/quote]  恩恩，查这个函数的时候网上有说，linux下是用这个malloc_usable_size()，在这个库/usr/include/malloc.h里。

user: user-0
content: 引用 11 楼 Adol1111 的回复:你可以去google一下关于野指针的问题。 指向“垃圾”内存（不可用内存）的指针。哈，明白，再次感谢！

user: user-1
content: 你可以去google一下关于野指针的问题。