正如您从代码中看到的,要从函数中提取字符串,我使用了两种方法,第一种方法是使用指针,第二种方法是使用全局数组。两者都有相同的结果,但是我想知道使用一个或另一个是错误的,因为他们建议我在没有给出解释的情况下不要使用全局变量。
原谅我的无知,很遗憾,我没有人要问,在搜索引擎中,我还没有找到可以处理这个话题的人。
#include <stdio.h>
#include <string.h>
char MyArr[18] = {'\0'}; // Global Array //
// This function use a *Pointer //
const char * MyWordWP( void )
{
return "Hello with pointer";
}
// This function use a global array //
void MyWordArr( void )
{
strcpy(MyArr, "Hello With Array");
}
int main( void )
{
// Read pointer //
const char *MyW = MyWordWP( );
printf( "With Pointer = %s \n" , MyW );
//Set the global //
MyWordArr();
printf( "With Array = %s \n", MyArr);
return 0;
}
谢谢您的支持。
例如,为什么不过度使用全局对象和数组的一些原因:
首先,使用全局对象的函数不是很可重用。标识符硬编码在源代码中。这使得该功能的使用几乎是唯一的,这通常不是最佳解决方案。相反,参数允许传递来自不同标识符的对象的值,并且在指针的情况下也传递来自不同大小的数组的地址。
对于类似的从函数返回值和指针的过程也是如此,就像您所使用的情况一样。注意,在函数内部,必须使用存储类说明符static
声明对象,以在函数执行结束后保留在内存中,这对于返回指向函数本地对象的指针非常重要。
字符串文字"Hello With Array"
存在于函数MyWordArr()
的执行范围之外,因为字符串文字一直驻留在内存中,直到程序完成。
其次,当源代码非常庞大且源代码不完整时,您的代码可能难以为他人阅读和维护,对于您自己也是如此。在几百次函数调用之后,您失去了exquisite概述,可能会问自己:“该函数实际上在做什么?” -与此相反,传递的参数和返回值描述了使用函数调用的意图和上下文。
第三,几乎可以从代码中的任何位置访问对象,这使得在大型程序中很难找到意外修改的原因。
第四,全局对象不是线程安全的。
因此得出结论:
取决于使用情况。在您提供的示例中,由于程序较小且专注,它可能非常适合,但是通常,您应尝试(如果可能的话)避免使用全局对象,因为在大多数情况下,生产代码非常大,并且往往会自己砸脑。
使用数组或指针的全局变量的一个很好的理由是,当有一个或多个始终使用该(全局)变量的函数并将其编码到逻辑中时。在这种情况下,您将最终获得一个充满对“ func(myvar);”的调用的程序。当逻辑是func()always应该读取或更新该变量“ myvar”时。
示例可能是文本控制台驱动程序或库,其中屏幕的缓存保留在内存中。该应用程序调用setcursorto(x,y),display(“ hello”),color(yellow)等;所有这些例程都会更新内存中的缓存:嗯,该缓存应该是一个全局变量,并且无需将该全局变量传递给对其进行操作的每个函数。
关于可见性,并非所有全局变量都必须对所有程序可见。 C源文件可以具有外部看不见的静态全局变量。
请不要使用全局数组方法,因为这会导致难以阅读和调试代码。
如果指针引用字符串文字或动态内存,则指针方法有效。
我认为最好的方法是使用std::string
,因为陷阱更少。
std::string MyWordSTR() //The (void) is not necessary and is mainly for C compatibility
{
return "Hello with std::string";
}