LINUX.ORG.RU

непонятка в си, глобальная ;-\


0

0

--t.h
struct my{
uint32_t ix;
};
--app.c
#include "t.h"
int my(..){
struct my *p = malloc(sizeof(struct my));
if(...){
return 0;
}
p->ix = whatever;
return 1;
}
--app2.c
#include "t.h"
int our (...){
struct sockaddr_in *sa *da;
struct in_addr x;
struct my *p; // = malloc(sizeof(struct my));
if(&p->ix ==0 ){
x.saddr = p->ix;
}else{
x.saddr = sa->sin_addr.s_addr;
}
1)
у меня в проектике несколько файликов и нужно в первом положить значение в структуру, а во втором вытащить из структуры, только вот если я не делаю malloc во втором файлике то получаю core dumped, но зачем его делать когда я уже выделял память в первом файлике и положил данные? странно, а почему не нужно выделять на другие поинтервы память? т.е. я споойно юзаю *sa и *da сравникая ip-адреса.

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

1.1)
но если я даже и делаю
struct my *p = malloc(sizeof(struct my));
но структура немного другая
struct my{
struct in_addr ix;
};
ну и работаю я с ней подругому
p->ix.s_addr;
то я получаю тот же адрес что и в struct in_addr, а я хочу указать свой...


> непонятка в си, глобальная ;-\

Почитай учебник.

Deleted
()

Структура это тип. Эти строки:

struct my { uint32_t ix; };

объявляют новый тип struct my. Объявление типа компилятор ни к чему не обязывает, память ни под что не выделяется.

А тут:

struct my *p = malloc(sizeof(struct my));

ты создаёшь экземпляр этого типа. Экземпляров твоего типа struct my может быть сколько угодно (сколько в память влезет). Точно также как и экземпляров типа int или double может быть сколько угодно.

struct my *p; // = malloc(sizeof(struct my));

if(&p->ix ==0 ){

А тут ты хочешь получить доступ именно к тому экземпляру struct my, который создала предыдущая функция.

Наводящий вопрос: как сделать так, чтобы одна функция посчитала какое-то число (экземпляр типа int), а другая им воспользовалась? Ответ: нужно передать этот экземпляр из одной функции в другую.

Твой тип struct my ничем от этого не отличается.

А вообще да, почитай учебник. Советую SICP. Сейчас ты можешь подумать "зачем оно мне", но потом скажешь спасибо. Эта книга именно учит проектировать программы и придумывать простые алгоритмы.

bvvv
()
Ответ на: комментарий от bvvv

>Ответ: нужно передать этот экземпляр из одной функции в другую.
это понятно, но я не вызываю одну функцию в другой непосредственно, они вызываются в разных местах из других функций в таком порядке, первая. а потом вторая.

или как понять передать? сделать что-бы первая ф-ция указывада на структуру?

>А вообще да, почитай учебник. Советую SICP.

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

syn
() автор топика

--t.h
struct my{
	uint32_t ix;
	};

--app.c
#include "t.h"
struct my *p;

int main(int argc,char *argv[]){
p = malloc(sizeof(struct my));
return 0;
}

int my(..){
// struct my *p = malloc(sizeof(struct my));
if(...){
	return 0;
	}
p->ix = whatever;
return 1;
}

--app2.c
#include "t.h"
extern struct my *p;

int our (...){
struct sockaddr_in *sa *da;
struct in_addr x;
// struct my *p; // = malloc(sizeof(struct my));
if(&p->ix ==0 ){
	x.saddr = p->ix;
	}else{
		x.saddr = sa->sin_addr.s_addr;
	}
}

josephson ★★
()
Ответ на: комментарий от sjinks

>А в чем глубокий философский смысл проверки
проверяю пусто или нет, он как не странно не пусто почему-то, ничего туда еще не ложил. т.е. по идее если я туда ничег не ложил, то должен быть 0

и стати, странно, почему я не могу выделить память тоже глобально, а толко в функции?
p = malloc(sizeof(struct my));

syn
() автор топика
Ответ на: комментарий от syn

Под одинаковым именем p в первом и втором случае используются разные переменные.

Если ты туда ничего не ложил, то там будет мусор а не 0. И попытка разыменования мусора приводит к core dump-у. Если память выделить, то разыменовать можно, там лежит мусор, ага. И конструкция &p->ix == 0 весьма бредова, я не понял, что имелось в виду.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

&p->ix == 0 - Это индусокод. Посмотрите на приоритет операций в си(на вики есть). Перво наперво произойдёт разыменование указателя на структуру _p_, затем взятие адреса _ix_ и последнее сравнение с нулём.

gcc
()
Ответ на: комментарий от gcc

PS: А раз ix у нас не указатель, то какой смысл сравнивать его адрес с нулевым указателем ? Глупо как-то. Что бы так ни было - оно будет отлично от нулевого указателя.

gcc
()

как всё печально...

топикстартеру рекомендую либо руки прочь от Си, либо прочитать хоть какой-нибудь учебник по нему до полного просветления.

xydo ★★
()
Ответ на: комментарий от gcc

> Глупо как-то

Я о том же. Единственный побочный эффект на умном компиляторе — это проверка того, что malloc() не вернула NULL. Но мне кажется, что намерения там были другими.

sjinks ★★★
()
Ответ на: комментарий от syn

> проверяю пусто или нет

Убери амперсанд. Левая часть выражения (до проверки на ноль) — это взятие адреса элемента. Фактически ты проверяешь, равен p NULL или нет (в зависимости от компилятора/оптимизатора) такой способ проверки может закончиться SIGSEGV.

> если я туда ничег не ложил, то должен быть 0

Почему? Если ты туда ничего не ложил, то быть там может все, что угодно. Если хочешь, чтобы был 0, то выделяй память, например, calloc(), а не malloc() (хотя нет ничего лучше явной инициализации, поверь).

> и стати, странно, почему я не могу выделить память тоже глобально, а толко в функции?

Ну как бы таков синтаксис языка. Результат вызова функции не может использоваться в качестве инициализатора глобальной переменной.

Если ты хочешь сделать её глобальной, зачем страдать с динамическим выделением памяти, когда можно использовать статическое выделение и не иметь геморроя с указателями?

sjinks ★★★
()
Ответ на: комментарий от syn

> ок, нашел, читать долго, на досуге почитаю, только сейчас мне нужно это быстро победить...

Сейчас ты быстро победишь это, потом ещё что-то, а потом кому-то разгребать твой код. Причём этим кто-то в будущем можешь оказаться и ты сам!

bvvv
()

Какой смысл в таком синтаксисе?

Зачем перед my* p в C нужно писать слово struct? Какой в этом глобальный смысл?

SSZB
()
Ответ на: Какой смысл в таком синтаксисе? от SSZB

> Зачем перед my* p в C нужно писать слово struct?

Денис Ритчи этот топик вряд ли читает, так что __правильного__ ответа не ждите.

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.