函数返回指向字符串的指针不起作用

时间:2015-09-02 11:40:47

标签: c

我想知道为什么以下工作不正确?虽然我尝试过其他方法,但为了更清晰起见,我想知道这里出现的问题。

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);
}

2 个答案:

答案 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()

返回一个指针