首页 > 试题广场 >

下面代码会出现什么问题?

[问答题]
下面代码会出现什么问题?
void Test( void ) 
{ 
 char *str = (char *) malloc( 100 ); 
 strcpy( str, "hello" ); 
 free( str );  
 ... //省略的其它语句 
} 
看了这几道练习题,总结一下:malloc函数以及free函数的注意事项

首先 void *  __cdecl malloc(size_t);是malloc函数的声明
需要注意的是:1 形参size_t必须是>=0的整数
2 对分配的内存类型强制转换成需要的类型(void *)-》(T *)
3 如果内存紧张,可能导致分配失败,此时会返回NULL,所以要对分配结果进行检查

对于free函数void    __cdecl free(void *);
需要注意的值域一点,那就是野指针,free(p)之后,需要让p=NULL

发表于 2018-03-14 17:48:56 回复(0)
//应该这么写
void Test( void )
{
 char *str = NULL;
 str = (char *) malloc( 100 );
 if(NULL == str)
{
printf("malloc error\n"); 
 return -1;
}
 strcpy( str, "hello" );
 free( str ); 
 str = NULL;
 ... //省略的其它语句
}

编辑于 2016-08-02 14:26:29 回复(2)
在执行  
char *str = (char *) malloc(100);  
后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:  
str = NULL;  
试题6的Test函数中也未对malloc的内存进行释放。  
发表于 2015-10-28 18:00:43 回复(2)
free后没有将指针赋值为NULL
发表于 2020-08-31 21:35:49 回复(0)
<p>1.未对申请结果判断</p><p>2.free后未置空指针</p>
发表于 2020-07-22 12:53:56 回复(0)

Free之后没有将指针赋值NULL

发表于 2020-04-17 23:39:19 回复(0)
注意注意
发表于 2020-04-05 12:43:34 回复(0)

// 写一下野指针

char *p1;

char *p2 = NULL;

char *p3;

//p1、p2、p3从高地址到低地址分布,但由于计算机不会自动的将&p1、&p3表示的内存地址中存放的值置为0,所以当我们声明这两个指针的时候,&p1和&p3表示的地址中存放了一个可能不为0的数,也就是当你*p的时候会访问一个非法的内存位置,但是编译器并不会报错。同理如果使用完指针未置NULL,也可能造成这种问题。


发表于 2020-03-26 09:16:45 回复(0)
1.开辟内存后 要对开辟的内存进行判断 看malloc是否成功 2.开辟完内存 程序运行完要对进行释放free 并且指针也要NULL
发表于 2020-03-22 00:30:08 回复(0)
1.分配内存要检查内存是否分配成功 2.释放指针后,指针NULL
发表于 2020-03-14 21:04:37 回复(0)
内存释放之后要为空
发表于 2020-03-03 18:13:22 回复(0)

1.拷贝之前,需要将堆空间内存初始化2.释放堆空间之后,需要置空,否则为野指针3.如果内存紧张,分配会失败,需要判断

编辑于 2019-12-25 20:36:42 回复(0)

第一点 分配后没有判空

第二点 释放后没有把指针赋值为空

发表于 2019-12-24 12:16:54 回复(0)

最后写个str=NULL;不加的话会有野指针;str所指向的内存释放了,但是其还会指向内存地址中一块未知的区域.


发表于 2019-11-06 18:50:40 回复(0)
我只能说 吹毛求疵
发表于 2019-10-13 15:56:35 回复(0)

str要置null

发表于 2019-08-19 19:35:59 回复(0)
没有进行内存申请是否成功的判断,没有free内存
发表于 2019-08-04 11:52:16 回复(0)

未对内存是否申请成功进行判断

s t r未设为空

编辑于 2019-08-02 10:10:46 回复(0)

malloc的全称是memory allocation,中文叫动态内存分配。
原型:

extern void *malloc(unsigned int num_bytes);

说明:分配长度为 num_bytes 字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用 free() 函数将内存块释放。
注意事项:

  1. 申请了内存空间后,必须检查是否分配成功。
  2. 当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
  3. 这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
  4. 虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
发表于 2019-06-16 11:13:19 回复(0)

1.在执行  
char *str = (char *) malloc(100);  
后未进行内存是否申请成功的判断;
2.在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:  
str = NULL;  
发表于 2019-04-16 11:34:51 回复(0)