2013-08-15 2 views
0

Я работаю со связанными списками и решил, что было бы очень полезно иметь глобальную переменную с адресом первой «корневой» ссылки в списке.C - Назначение указателей на конкретные местоположения

У меня тогда есть несколько других функций, которые используют эту «корневую» ссылку, используя ее в качестве исходной ссылки.

Как это можно сделать?

Моя попытка была (в целом):

int rootAddress = 0; 

int main(){ 
    //EDIT float *ptr = 5; -> my mistake there is not 'float' in my code 
    int *ptr = 5;    //but I still get these warnings 
    rootAddress = ptr; 

    return 0; 
} 

int laterFunction(){ 
    // float *ptr = rootAddress; 
    int *ptr = rootAddress; 
    return 0; 
} 

Хотя я получаю два предупреждения:

warning: initialization makes pointer from integer without cast 
warning: assignment makes integer from pointer without cast 

Что такое правильный способ сделать это, или то, что это лучший способ идти о сохранить этот «корневой» указатель вообще, если этот подход неэффективен?

+0

В: Было бы полезно иметь глобальную переменную. A: Конечно. Это совершенно легально. Q: Хотя я получаю предупреждения: инициализация делает указатель из целого без приведения ... A: Просто объявляйте ваш глобальный тип указателя, а не int. – paulsm4

+0

Как в: int * rootAddress = NULL; ? – sherrellbc

ответ

1

Вместо использования глобальных переменных и загрязнения пространства имен рассмотрите возможность использования структуры обертки. У вас будет одна структура для связанного списка, а другая - для узла, и вы будете передавать указатель на структуру связанного списка. Это будет сделано следующим образом:

struct linkedlist { 
    struct node *front; 
    int len; 
}; 

struct node { 
    int item; 
    struct node *next; 
}; 

... где item деталь вы хотите хранить в каждом узле. Вы можете изменить это как тип данных, который вы хотите или использовать указатели void для создания общего связанного списка. Обязательно добавьте поле для бесплатной функции, которую клиент предоставит, если вы решите внедрить общий список ссылок.

+0

Где я могу найти документацию по этому подходу, потому что я не совсем понимаю эту идею здесь. Является ли это связанным списком внутри структуры? Где внешняя структура имеет указатель, указывающий на внутреннюю? Таким образом, внешняя структура всегда имеет ссылку на первый узел? – sherrellbc

+1

@sherrellbc, это абсолютно правильно - структура 'linkedlist' передается и всегда указывает на передний узел. Для этого нет стандартной документации по стандарту C в качестве ее реализации для абстрактного метода математического моделирования (однако это общая реализация этого ADT). –

+0

Мне это нравится. Спасибо тебе за это. Делает это намного проще, поскольку вы всегда имеете эту корневую ссылку, не сохраняя ее явно. – sherrellbc

1

вместо int rootAddress = 0; сделать это float *rootAddress = 0 и вместо rootAddress = &ptr использовать rootAddress = ptr. Вы получаете предупреждения, потому что ваши типы не совпадают.

+0

Я удалил & character - это была ошибка, когда я набрал этот вопрос. Кроме того, почему тип данных с плавающей точкой? – sherrellbc

+0

просто сделайте типы одинаковыми, и вы будете на своем пути. –

+0

О, стреляй, ну, на самом деле, я тоже не собирался делать поплавок. Я не могу сейчас это заменить. В моем фактическом коде нет «float», но я все еще получаю эти предупреждения. – sherrellbc

1
float * rootAddress = NULL; 

int main(){ 
float *ptr = (float *)malloc(sizeof(float)); 
*ptr = 5.0; 
rootAddress = ptr; 

return 0; 

}

int laterFunction(){ 
    float *ptr = rootAddress; 
    return 0; 

}

Просто нужно, чтобы убедиться, что все указатели одного и того же типа. Остерегайтесь насильственного литья из одного типа в другой.

+0

malloc возвращает указатель на пустоту. Должно ли задание указателя float указателю на пустоту быть достаточным? Кроме того, почему использование malloc в любом случае? В чем разница между явным распределением памяти для него, а не? – sherrellbc

+0

В зависимости от настроек компилятора вы можете получить предупреждения, если вы не используете void * для float *. ptr имеет адрес, malloc присваивает ptr действительный адрес. Если у вас есть, плавайте * ptr = 5. Он указывает на адрес 5, что приведет к уродству. – mahsan

+0

Я никогда не использовал malloc при работе в целом с указателями (аналогично примеру float * ptr = 5), потому что если malloc явно вызван, накладные расходы существуют для последующих вызовов free(), правильно? В чем разница, вызывая malloc и не называя его? Программа работает в любом случае – sherrellbc

Смежные вопросы