已解决:使用全局数组而不是指针来从函数数组中传输字符串

问题描述 投票:1回答:3

正如您从代码中看到的,要从函数中提取字符串,我使用了两种方法,第一种方法是使用指针,第二种方法是使用全局数组。两者都有相同的结果,但是我想知道使用一个或另一个是错误的,因为他们建议我在没有给出解释的情况下不要使用全局变量。

原谅我的无知,很遗憾,我没有人要问,在搜索引擎中,我还没有找到可以处理这个话题的人。

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

谢谢您的支持。

c arrays function pointers global
3个回答
1
投票

例如,为什么不过度使用全局对象和数组的一些原因:

首先,使用全局对象的函数不是很可重用。标识符硬编码在源代码中。这使得该功能的使用几乎是唯一的,这通常不是最佳解决方案。相反,参数允许传递来自不同标识符的对象的值,并且在指针的情况下也传递来自不同大小的数组的地址。

对于类似的从函数返回值和指针的过程也是如此,就像您所使用的情况一样。注意,在函数内部,必须使用存储类说明符static声明对象,以在函数执行结束后保留​​在内存中,这对于返回指向函数本地对象的指针非常重要。

字符串文字"Hello With Array"存在于函数MyWordArr()的执行范围之外,因为字符串文字一直驻留在内存中,直到程序完成。

其次,当源代码非常庞大且源代码不完整时,您的代码可能难以为他人阅读和维护,对于您自己也是如此。在几百次函数调用之后,您失去了exquisite概述,可能会问自己:“该函数实际上在做什么?” -与此相反,传递的参数和返回值描述了使用函数调用的意图和上下文。

第三,几乎可以从代码中的任何位置访问对象,这使得在大型程序中很难找到意外修改的原因。

第四,全局对象不是线程安全的。


因此得出结论:

取决于使用情况。在您提供的示例中,由于程序较小且专注,它可能非常适合,但是通常,您应尝试(如果可能的话)避免使用全局对象,因为在大多数情况下,生产代码非常大,并且往往会自己砸脑。


0
投票

使用数组或指针的全局变量的一个很好的理由是,当有一个或多个始终使用该(全局)变量的函数并将其编码到逻辑中时。在这种情况下,您将最终获得一个充满对“ func(myvar);”的调用的程序。当逻辑是func()always应该读取或更新该变量“ myvar”时。

示例可能是文本控制台驱动程序或库,其中屏幕的缓存保留在内存中。该应用程序调用setcursorto(x,y),display(“ hello”),color(yellow)等;所有这些例程都会更新内存中的缓存:嗯,该缓存应该是一个全局变量,并且无需将该全局变量传递给对其进行操作的每个函数。

关于可见性,并非所有全局变量都必须对所有程序可见。 C源文件可以具有外部看不见的静态全局变量。


-1
投票

请不要使用全局数组方法,因为这会导致难以阅读和调试代码。

如果指针引用字符串文字或动态内存,则指针方法有效。

我认为最好的方法是使用std::string,因为陷阱更少。

std::string MyWordSTR() //The (void) is not necessary and is mainly for C compatibility
{
    return "Hello with std::string";
}
© www.soinside.com 2019 - 2024. All rights reserved.