2014-10-28 101 views
0

以下是两个代码片段。一个正常工作,但另一个失败。
主要功能传递和返回数组(C代码)

int main 
{ 
int *x,*y,n,*c; 
//some code 
c=myfunc(x,y,n); 
//rest code 
} 

这里是工作的代码:

int * myfunc(int *a, int *b, int n) 
{ 
int *s,i,*t; 
for(i=0;i<n;i++) 
    s[i]=x[i]+y[i]; 
t=s; 
return s; 
} 

这里是行不通

int * myfunc(int *a, int *b, int n) 
{ 
int s[100],i,*t; 
for(i=0;i<n;i++) 
    s[i]=x[i]+y[i]; 
t=&s[0]; 
return t; 
} 

代码这里发生的是,即使返回的值是正确的地址(测试和检查)内容似乎自己修改。但是,在第一种情况下,情况似乎并非如此。
不仅如此,而且在执行的查询结束时,整个s [100]数组的内容都不相同。这基本上意味着所有这些地址的内容因为一些随机原因而被修改。

- 编辑 -
问题的直截了当方面:
为什么当为s初始化确实s的内容[100]得到恢复,并在那里为s的内容时,作为初始化* s不复位之后的复位。请注意:我没有使用malloc()或与我的代码上任何地方的堆栈有关的函数。

**使用的编译器是Turbo C **。

+0

这个问题并不完全达到我的查询点。 我的疑问是,为什么* s初始化工作,而不是s [100]。其余的代码是简单而相同的。没有使用malloc()函数,没有并发症。 – n0tty 2014-10-28 19:42:17

+0

查看我的其他评论。在这两种情况下,就我们所能看到的(除了'int * s'的隐藏,绝密初始化之外),你有未定义的行为。没有理由期望任一版本特别做任何事情。移动一些代码,重新排序一些函数调用,另一个版本现在可以*出现*工作。任何*都不应该*,因为任何理由。 – 2014-10-28 19:45:36

+0

对不起,最高机密初始化大声笑...我认为这只是一个垃圾代码,因为没有什么特别的。在问题中添加了整个功能。谢谢 – n0tty 2014-10-28 19:55:52

回答

0

没有什么随机的。你要返回一个局部变量的地址,一旦函数返回,它就不再存在。该空间被释放以用于将来的函数调用,变量等。

int * myfunc(int *a, int *b, int n) 
{ 
    int s[100],i,*t; 
    //some operation 
    t=&s[0]; 
    return t; 
}    // <!-- s is no longer valid after this point, so t is pointing nowhere 
+0

在工作代码中,我将_s_初始化为_ * s_,这只是另一个指针。而且它所做的操作与s [100]上完成的操作相同。 我明白了数组声明在函数的局部范围内,但是指针是否具有全局范围? – n0tty 2014-10-28 19:22:05

+0

但是,你从来没有向我们展示过如何在工作代码中初始化's'。我认为你已经分配了内存(通过'malloc()'等) - 在这种情况下scope与它无关。 'malloc()'-ed内存直到你调用'free()'为止。 – 2014-10-28 19:24:34

+0

嘿!没事儿! malloc()和其他函数未在代码中使用。但问题是,**为什么初始化int * s然后做t = s;并返回正常工作?这不是一个局部变量吗?还是定义一个指针使其全局可用?** – n0tty 2014-10-28 19:38:51

0

在不起作用的代码中,s[100]是堆栈中的数组,在函数返回时超出范围。在工作代码中,您不会显示如何分配s,但可能是malloc或其他非堆栈分配。

通常,不应该返回指向堆栈变量的指针,因为一旦函数返回,堆栈变量就会被覆盖。

PS。得到一个真正的编译器:)

+0

在工作代码中,我将_s_初始化为_ * s_,这只是另一个指针。而且它所做的操作与s [100]上完成的操作相同。 我明白了数组声明在函数的局部范围内,但是指针是否具有全局范围? – n0tty 2014-10-28 19:21:47