重复使用指针需注意...
tt
posted @ 2007年8月06日 00:14
in C语言编程
, 2866 阅读
在c编程过程中,我们不可避免地使用指针,为了节省变量,经常重复使用一个指针变量,这就需要注意内存的分配了,看下面这个例子:
-
#include<stdio.h>
-
#include<malloc.h>
-
-
int main()
-
{
-
int *arr1=NULL, *arr2=NULL; /*定义两个数组*/
-
int n1=2,n2=8;
-
arr1 = malloc(n1*sizeof(int)); /*为第一个数组分配内存*/
-
for (int i=0; i<n1; i++)
-
{
-
arr1[i] = i;
-
}
-
int *cpy_arr=NULL; /*中间变量,用于存放原数组数据*/
-
cpy_arr = malloc(n1*sizeof(int)); /*按照第一个数组长度分配内存*/
-
for (int i=0; i<n1; i++)
-
{
-
cpy_arr[i] = arr1[i];
-
}
-
arr2 = malloc(n2*sizeof(int)); /*为第二个数组分配内存*/
-
for (int i=0; i<n2; i++)
-
{
-
arr2[i] = 2*i;
-
}
-
for (int i=0; i<n2; i++) /*用第二个数组对临时数组赋值*/
-
{
-
cpy_arr[i] = arr1[i];
-
}
-
for(int i=0; i<n2; i++) /*输出第二个数组中的值*/
-
{
-
}
-
-
return 0;
-
}
编译:
# > 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在存放两个数组时的长度不同,每次都需要重新对其分配内存,以免内存冲突问题,修改后正确代码如下:
-
#include<stdio.h>
-
#include<malloc.h>
-
-
int main()
-
{
-
int *arr1=NULL, *arr2=NULL;
-
int n1=2,n2=8;
-
arr1 = malloc(n1*sizeof(int));
-
for (int i=0; i<n1; i++)
-
{
-
arr1[i] = i;
-
}
-
int *cpy_arr=NULL;
-
cpy_arr = malloc(n1*sizeof(int));
-
for (int i=0; i<n1; i++)
-
{
-
cpy_arr[i] = arr1[i];
-
}
-
arr2 = malloc(n2*sizeof(int));
-
for (int i=0; i<n2; i++)
-
{
-
arr2[i] = 2*i;
-
}
-
cpy_arr = malloc(n2*sizeof(int)); /*新加入的代码*/
-
for (int i=0; i<n2; i++)
-
{
-
cpy_arr[i] = arr1[i];
-
}
-
for(int i=0; i<n2; i++)
-
{
-
}
-
-
return 0;
-
}
编译后,运行结果如下:
# > ./mem
0 2 4 6 8 10 12 14
163754064 163754024
4
切记!切记!指针长度改变时,需要重新对其分配内存,是好的习惯,也是艺术、技巧!