重复使用指针需注意...

tt posted @ 2007年8月06日 00:14 in C语言编程 , 2866 阅读

在c编程过程中,我们不可避免地使用指针,为了节省变量,经常重复使用一个指针变量,这就需要注意内存的分配了,看下面这个例子:

 

  1. #include<stdio.h>
  2. #include<malloc.h>
  3.  
  4. int main()
  5. {
  6.     int *arr1=NULL, *arr2=NULL;                         /*定义两个数组*/
  7.     int n1=2,n2=8;
  8.     arr1 = malloc(n1*sizeof(int));                         /*为第一个数组分配内存*/
  9.     for (int i=0; i<n1; i++)
  10.     {
  11.         arr1[i] = i;
  12.     }
  13.     int *cpy_arr=NULL;                                             /*中间变量,用于存放原数组数据*/
  14.     cpy_arr = malloc(n1*sizeof(int));                     /*按照第一个数组长度分配内存*/
  15.     for (int i=0; i<n1; i++)
  16.     {
  17.         cpy_arr[i] = arr1[i];
  18.     }
  19.     arr2 = malloc(n2*sizeof(int));                          /*为第二个数组分配内存*/
  20.     for (int i=0; i<n2; i++)
  21.     {
  22.         arr2[i] = 2*i;
  23.     }
  24.     for (int i=0; i<n2; i++)                                        /*用第二个数组对临时数组赋值*/
  25.     {
  26.         cpy_arr[i] = arr1[i];
  27.     }
  28.     for(int i=0; i<n2; i++)                                         /*输出第二个数组中的值*/
  29.     {
  30.         printf("%d\t",arr2[i]);
  31.     }
  32.     printf("\n");
  33.     printf("%d ",cpy_arr);
  34.     printf("%d\n", arr2);
  35.     printf("%d\n", sizeof(int));
  36.  
  37.     return 0;
  38. }

编译:

 

# >  gcc -g mem.c -o mem --std=c99

 

# >  ./mem

执行结果如下:

0       1       0       17      8       10      12      14
151248920 151248936
4

可以看到最前面的四个数据不对,应该是 0 2 4 6 才对,怎么成了 0 1 0 17 了呢?

看下面的输出的内存信心

cpy_arr: 151248920

arr2     : 151248936

arr2的地址比cpy_arr的地址大16,说明cpy_arr存方四个字节的东西就到arr2的地址范围了,而存放八个数之后,将对arr2地址中的内容进行修改,出现了内存访问冲突问题,这就是导致不正确输出的原因。

由于cpy_arr在存放两个数组时的长度不同,每次都需要重新对其分配内存,以免内存冲突问题,修改后正确代码如下:

 

  1. #include<stdio.h>
  2. #include<malloc.h>
  3.  
  4. int main()
  5. {
  6.     int *arr1=NULL, *arr2=NULL;
  7.     int n1=2,n2=8;
  8.     arr1 = malloc(n1*sizeof(int));
  9.     for (int i=0; i<n1; i++)
  10.     {
  11.         arr1[i] = i;
  12.     }
  13.     int *cpy_arr=NULL;
  14.     cpy_arr = malloc(n1*sizeof(int));
  15.     for (int i=0; i<n1; i++)
  16.     {
  17.         cpy_arr[i] = arr1[i];
  18.     }
  19.     arr2 = malloc(n2*sizeof(int));
  20.     for (int i=0; i<n2; i++)
  21.     {
  22.         arr2[i] = 2*i;
  23.     }
  24.     cpy_arr = malloc(n2*sizeof(int));          /*新加入的代码*/
  25.     for (int i=0; i<n2; i++)
  26.     {
  27.         cpy_arr[i] = arr1[i];
  28.     }
  29.     for(int i=0; i<n2; i++)
  30.     {
  31.         printf("%d\t",arr2[i]);
  32.     }
  33.     printf("\n");
  34.     printf("%d ",cpy_arr);
  35.     printf("%d\n", arr2);
  36.     printf("%d\n", sizeof(int));
  37.  
  38.     return 0;
  39. }

 

编译后,运行结果如下:

# > ./mem
0       2       4       6       8       10      12      14
163754064 163754024
4

 切记!切记!指针长度改变时,需要重新对其分配内存,是好的习惯,也是艺术、技巧!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter