一个关于指针的小程序!

来源:百度知道 编辑:UC知道 时间:2024/06/09 00:14:43
程序如下:
不知道为什么在输出ptr_len=5之后会有段错误?
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
char *ptr=NULL;
char str1[] = "hello";
char str2[] = "wo";
ptr = malloc(10);
ptr = str1;
printf("ptr_len=%d\n",strlen(ptr));
free(ptr);
ptr = NULL;

ptr = malloc(10);
ptr=str2;
printf("ptr_len after-free=%d\n",strlen(ptr));
free(ptr);
ptr = NULL;
}
呵,多谢!可以了。
请问一下,为什么呢?

再一个就是如何清除一个指针指向的内容呢?
比如:char *ptr="hello";
如何清除ptr指向的内容呢?

ptr = malloc(10);
ptr = str1;
上面这个处理有问题,
你将ptr指向新申请的空间后,
又将它指向了str1这个地址,
这导致了两个问题:
1. 之前分配的malloc(10)这个内存变成了野地址对应的内存
2. free(ptr); 这一句变成了释放str1指向内存,str1是一个常量区,进行free操作是错误的

ptr = malloc(10);
ptr=str2;
这两句也一样

应该这么改:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
char *ptr=NULL;
char str1[] = "hello";
char str2[] = "wo";
ptr = (char*)malloc(10);
strcpy(ptr,str1);
printf("ptr_len=%d\n",strlen(ptr));
free(ptr);
ptr = NULL;

ptr = (char*)malloc(10);
strcpy(ptr,str2);
printf("ptr_len after-free=%d\n",strlen(ptr));
free(ptr);
ptr = NULL;
}

===========================================
比如:char *ptr="hello";
如何清除ptr指向的内容呢?
"hello"是常量,不用手动释放,
这里的ptr不用释放的。