我想知道为什么以下工作不正确?虽然我尝试过其他方法,但为了更清晰起见,我想知道这里出现的问题。
char *fuc(char *s)
{
char t[10];
int r=0;
while(s[r] != '\0')
{
t[r] = s[r];
r++;
}
t[r]='\0';
return &t[0];
}
main()
{
char s[]="abcde";
char *p;
p=func(s);
puts(p);
}
答案 0 :(得分:3)
在fuc()
中,char t[10];
是一个局部变量。函数完成执行后,就不存在t
。因此,在调用者中,返回的指针变为无效。
使用返回的指针进一步导致undefined behaviour。
如果要从fuc()
返回指针,则需要使用动态内存分配功能,如malloc()
和family。在这种情况下,在调用函数内部,一旦你完成了使用内存,你也需要注意free()
分配的内存。
这就是说,从逻辑的角度来看,在你的fuc()
内,你正在迭代t
而不检查界限。在使用索引之前,您应该检查t
的大小。
此外,main()
不是函数的正确形式。至少应该是int main(void)
。
答案 1 :(得分:2)
数组t
是函数func()
的本地函数,因此一旦退出该函数,就无法访问数组t
,这将导致未定义的行为。
你应该在堆上分配内存。
char *t = malloc(10);
现在您可以从函数func()