Используйте Global Array вместо Pointer для массива для передачи строки из функции - PullRequest
1 голос
/ 20 апреля 2020

Как видно из кода, для извлечения строки из функции я использовал два метода, первый - использование указателя, а второй - глобальный массив. Оба имеют одинаковый результат, но я хотел знать, является ли ошибкой использование одного или другого, так как они посоветовали мне не использовать глобальные переменные без объяснения причин.

прости мое невежество, к сожалению, я мне не с кем спросить, и в поисковых системах я не нашел человека, который бы имел дело с этим топи c.

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

Спасибо за вашу поддержку.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Несколько причин, по которым не следует использовать глобальные объекты и массивы слишком широко, например:

Во-первых, функции, которые используют глобальные объекты, не очень многократно используются. Идентификаторы жестко закодированы в исходном коде. Это делает использование функции практически уникальным, что, как правило, не лучшее решение. Напротив, параметры позволяют передавать значения из объектов разных идентификаторов, а в случае указателей также адреса из массивов разных размеров.

То же самое относится и к обратному процессу возврата значений и указателей из функций, как в вашем случае. Обратите внимание, что внутри функции объект должен быть объявлен со спецификатором класса хранения static, чтобы оставаться в памяти после окончания выполнения функции, что важно в случае возврата указателя на локальный объект функции.

Строковый литерал "Hello With Array" существует вне выполнения функции MyWordArr(), поскольку строковые литералы находятся в памяти до завершения программы.

Во-вторых, ваш код может стать трудным для чтения и обслуживания для других, но также и для себя, когда исходный код очень велик и, например, после нескольких сотен вызовов функций вы потеряли немного изысканного обзора и можете спросить себя: «Что на самом деле делает функция?» - в отличие от этого, переданные параметры и возвращаемые значения описывают намерение и контекст использования вызова функции довольно хорошо.

В-третьих, к объекту можно получить доступ практически из любого места кода, что затрудняет поиск причины непреднамеренного изменения в большой программе.

В-четвертых, глобальные объекты не являются поточно-ориентированными.


Итак, заключение:

Зависит от случая использования. В приведенном вами примере это может хорошо сработать, поскольку программа небольшая и целенаправленная, но в целом вы должны стараться (если это возможно) избегать глобальных объектов, поскольку производственный код в большинстве случаев очень большой и имеет тенденцию разбивать мозги сам по себе.

1 голос
/ 20 апреля 2020

Возможно, хорошей причиной для использования глобальной переменной, либо массива, либо указателя, является наличие одной или нескольких функций, которые всегда используют эту (глобальную) переменную, и это закодировано в logi c. В таком случае вы получите программу, полную вызовов "fun c (myvar);" когда логика c такова, что c () всегда должны читать или обновлять эту переменную "myvar".

Примером может быть драйвер или библиотека текстовой консоли, где Кеш экрана хранится в памяти. Приложение вызывает setcursorto (x, y), display («привет»), color (желтый) и т. Д .; все эти подпрограммы обновляют кэш в памяти: хорошо, что кэш должен быть глобальной переменной, и нет необходимости передавать эту глобальную переменную каждой функции, работающей над ней.

Что касается видимости, то не всех глобальных переменных должны быть видны для всей программы. Исходный файл C может содержать глобальные переменные c, не видимые снаружи.

...