【发布时间】:2014-10-28 19:02:07
【问题描述】:
以下是两个代码sn-ps。一个工作正常,但另一个失败。
主要功能
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] 的整个数组在执行查询的末尾也有不同的内容。这基本上意味着所有这些地址的内容都由于某种随机原因而被修改。
使用的编译器是 Turbo C。
编辑
直截了当的问题:
为什么初始化为s[100]时s的内容在返回后会被重置,而初始化为*s时s的内容不会重置。请注意:我没有使用 malloc() 或与我的代码中任何位置的堆栈有关的函数。
【问题讨论】:
-
这个问题并没有完全达到我的查询重点。我的疑问是,为什么 *s 初始化工作而不是 s[100]。我的其余代码很简单。没有使用 malloc() 函数,没有复杂化。
-
查看我的其他评论。在这两种情况下,就我们所见(除了
int *s的隐藏的、绝密的初始化之外),您有未定义的行为。没有理由期望任何一个版本都能做任何特别的事情。移动一些代码,重新排序一些函数调用,其他版本现在可能出现可以工作。出于任何充分的理由,两者都不应该起作用。 -
对不起,最高机密的初始化大声笑...我认为这只是一段垃圾代码,因为它没有做任何特别的事情。在问题中添加了整个功能。谢谢
标签: c arrays function pointers