Функция Malloc (динамическое выделение памяти), приводящая к ошибке при глобальном использовании - PullRequest
9 голосов
/ 19 июля 2011
#include<stdio.h>
#include<string.h>
char *y;
y=(char *)malloc(40); // gives an error here
int main()
{
    strcpy(y,"hello world");
}

error: conflicting types for 'y'
error: previous declaration of 'y' was here
warning: initialization makes integer from pointer without a cast
error: initializer element is not constant
warning: data definition has no type or storage class
warning: passing arg 1 of `strcpy' makes pointer from integer without cast

Теперь реальный вопрос в том, можем ли мы сделать динамическое распределение памяти глобально? Почему при глобальном использовании malloc выдается ошибка? И код работает без ошибок, если я помещаю оператор malloc в основную функцию или какую-то другую функцию. Почему это так?

#include<stdio.h>
#include<string.h>
char *y;
int main()
{
    y=(char *)malloc(40); 
    strcpy(y,"hello world");
}

Ответы [ 3 ]

21 голосов
/ 19 июля 2011

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

malloc - это вызов функции, поэтому он недопустим вне функции.

Если вы инициализируете глобальную переменную-указатель с помощью malloc из своей главной (или любой другой действительной функции), она будет доступна всем другим функциям, где эта переменная находится в области видимости (в вашем примере, всем функциям в файле, который содержит main).

(Обратите внимание, что глобальных переменных следует избегать, когда это возможно.)

1 голос
/ 19 июля 2011

ну, речь идет не о глобальном использовании malloc.ваш процесс malloc должен находиться в любой функции, основной или любой другой пользовательской функции .Глобально вы можете только расстаться с переменной.Поскольку 'y' объявлено глобально, malloc является вызовом функции.это должно находиться внутри любой функции.Не только malloc, вы не можете вызывать любую функцию, как вы вызывали здесь.Вы можете только объявить функцию как глобальную или локальную .

0 голосов
/ 11 июня 2014

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

static int *pi = malloc(sizeof(int));

Это создаст сообщение об ошибке во время компиляции. То же самое происходит с глобальным переменные, но можно избежать для статических переменных с помощью отдельного оператора для выделения память для переменной следующим образом. Мы не можем использовать отдельный оператор присваивания с глобальные переменные, потому что глобальные переменные объявляются вне функции и исполняемого файла код, такой как оператор присваивания, должен быть внутри функции: static int *pi; pi = malloc(sizeof(int));

С точки зрения компилятора существует разница между оператор инициализации = и с помощью оператора присваивания =.

...