问我有一个函数,本应返回一个字符串,但在返回给调用者时,返回的字符串却是乱码。
答当函数返回一个指针时,请确保被指向的内存已正确分配。例如,确保你没有做类似这样的事情:
当函数返回时,其自动、局部变量会被丢弃,因此在这种情况下返回的指针是无效的(它指向一个已不存在的数组)。
#include <stdio.h>
char *itoa(int n) { char retbuf[20]; /* WRONG */ sprintf(retbuf, "%d", n); return retbuf; /* WRONG */ }
一种修复方法是将返回缓冲区声明为:
static char retbuf[20];这种修复是不完美的,因为使用静态数据的函数不是可重入的。此外,对此版本的调用itoa会不断地覆盖同一个返回缓冲区:调用者将无法调用它几次并将所有返回值同时保留下来。
参考:ISO 第 6.1.2.4 节