注册 登录
编程论坛 C++教室

c语言局部变量,做练习题时遇到的问题

Garra耻辱 发布于 2011-05-28 00:25, 469 次点击
#include<stdio.h>

int * sum(int a[],int b[])
{
 int *p,i,c[5];
 p=c;
 for(i=0;i<5;i++)
 {
  c[i]=a[i]+b[i];
 }
 return p;
}
int main(void)
{
 int a[5]={1,2,3,4,5},b[5]={11,4,2,7,9},i,*p=a;

 p=sum(a,b);
 printf("a[0],a[1],a[3]..a[5]:\n");
 for(i=0;i<5;i++,p++)
 {
  printf("%d,",*p);
 }
 printf("\n");
 return 0;
}
谁帮帮我,告诉我这个程序错在哪里,有人给我说是自定义函数里的局部变量释放了,但是我没能理解。
9 回复
#2
naruto012011-05-28 00:37
程序代码:
int * sum(int a[],int b[])
{
int *p,i,c[5];
p=c;
for(i=0;i<5;i++)
{
  c[i]=a[i]+b[i];
}
return p;
}

你返回了一个指向内部变量的指针,而这个指针是临时的。函数返回后就无效了。
#3
Garra耻辱2011-05-28 01:28
回复 2楼 naruto01
那如果我a[i]=a[i]+b[i];
zuihou return a;
可以吗
#4
Garra耻辱2011-05-28 01:30
回复 3楼 Garra耻辱
要是是你你会怎么编啊。我觉得我的想法太绕了
#5
naruto012011-05-28 01:42
程序出现的问题在于int c[5]数组声明在了函数体内。
那么很简单的方法就是把它声明成全局的数组,不就行了?
#6
ellie782011-05-28 01:44
回复 3楼 Garra耻辱
可以。
因为一旦返回,变量p就不存在了,所以指向p的指针将是无效的。有的编译器会在这种情况下给出类似"function returns address of local variable"的警告。你修改完后的代码可以编译通过。
#7
Garra耻辱2011-05-28 01:59
回复 6楼 ellie78
谢谢
#8
记叙、继续2011-05-28 03:56
多检查,多对比
#9
烟雾中的迷茫2011-05-28 07:19
程序代码:
p=c;
for(i=0;i<5;i++)
{
  c[i]=a[i]+b[i];
}
return p;
}
而且这里 你的p在前面把c赋给它 首先c就没有初值 所以p也是不定的随着函数调用c不固定p就不固定  后面进行数组运算 也没有给p再次赋值 p保持原值
#10
coolsonic2011-05-28 09:08
一句话:不要返回指向临时变量的指针。
改法:你把数组C作为参数直接传进去就行了。
1