Test/Test2/Test3/Test4(内存问题)

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. #include <iostream.h>
  5. /*
    • Test.cpp
  6. *
    • Created on: Oct 22, 2008
    • Author: root
  7. */
    1. char *GetMemory( void ) {
  8. char p[] = “hello world” ;
  9. return p;
  10. }
    1. void Test( void ) {
  11. char *str = NULL;
  12. str = GetMemory();
  13. printf(str);
  14. }
    1. void GetMemory2( char *p) {
  15. p = ( char *) malloc(100);
  16. }
    1. void Test2( void ) {
  17. char *str = NULL;
  18. GetMemory2(str);
  19. strcpy(str, “hello world” );
  20. printf(str);
  21. }
    1. void Test3( void ) {
  22. char str = ( char ) malloc(100);
  23. strcpy(str, “hello” );
  24. free(str);
  25. if (str != NULL){
  26. strcpy(str, “world” );
  27. printf(str);
  28. }
  29. }
    1. void GetMemory4( char **p, int num) {
  30. p = ( char ) malloc(num);
  31. }
    1. void Test4( void ) {
  32. char *str = NULL;
  33. GetMemory4(&str, 100);
  34. strcpy(str, “hello” );
  35. printf(str);
  36. }
  37. void testSizeOf(){
  38. cout << endl << “ sizeof(char) “ << sizeof ( char ) << endl;
  39. cout << “ ssizeof(int) “ << sizeof ( int ) << endl;
  40. cout << “ sizeof(unsigned int) “ << sizeof (unsigned int ) << endl;
  41. cout << “ sizeof(long) “ << sizeof ( long ) << endl;
  42. cout << “ sizeof(unsigned long) “ << sizeof (unsigned long ) << endl;
  43. cout << “ sizeof(float) “ << sizeof ( float ) << endl;
  44. cout << “ sizeof(double) “ << sizeof ( double ) << endl;
  45. cout << “ sizeof(void ) “ << sizeof ( void ) << endl;
  46. }
  47. int main() {
  48. //Test();
  49. //Test2();
  50. //Test3();

  51. Test4();

  52. testSizeOf();
  53. return 0;
  54. }

上面的代码来自高质量C++/C编程指南。

Test()的运行结果是未知,因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是
NULL,但其原现的内容已经在函数退出后被清除,新内容不可知。

Test2()的运行结果是程序崩溃。因为GetMemory2并不能传递动态内存(编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使
_p = p。传入的是一个指针,在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变),Test函数中的 str一直都是
NULL。strcpy(str, “hello world”);将使程序崩溃。

Test4 ()的运行结果是hello。因为传入的是指针的指针,所以_p的改变,也就是改变传入的参数,故str被正确的复制。

Test3()的运行结果是输出world。篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,但是str并没有置成空,所以if(str
!= NULL)语句不起作用。