函数返回指向字符串不起作用的指针
我想知道为什么以下工作不正确? 虽然我尝试了其他方法,但为了更清晰,我想知道这里发生的问题。
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); }
在你的fuc()
, char t[10];
是一个局部变量。 一旦你的函数完成执行,就不存在t
。 因此,在调用者中,返回的指针变为无效。
使用返回的指针进一步导致未定义的行为 。
如果要从fuc()
返回指针,则需要使用动态内存分配函数,如malloc()
和family。 在这种情况下,在调用函数内部,一旦你完成了使用内存,你需要注意free()
分配内存。
也就是说,从逻辑的角度来看,在你的fuc()
,你在没有检查边界的情况下迭代t
。 在使用索引之前,您应该检查t
的大小。
此外, main()
不是函数的正确forms。 至少,它应该是int main(void)
。
数组t
是函数func()
本地函数,因此一旦退出函数,就无法访问数组t
,这将导致未定义的行为。
你应该在堆上分配内存。
char *t = malloc(10);
现在你可以从函数func()
返回一个指针