powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
25 сообщений из 308, страница 11 из 13
Си. Освободить память 2-мерного сторкового массива
    #40133104
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Мне было просто интересно какое действие Касперский посчитал вредоносным. Открытие сетевого сокета наружу?



Думаю да, там был забор данных с другого сервера.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткътам был забор данных с другого сервера.

Требующий остановки других приложений, ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133176
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткътам был забор данных с другого сервера.

Требующий остановки других приложений, ага...


Поясните.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133178
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, извиняюсь, невнимательно прочёл логи, не заметил, что первая запись относится
к WER.

Падение твоей программы не имеет ничего общего с аантивирусом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133186
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

А, извиняюсь, невнимательно прочёл логи, не заметил, что первая запись относится
к WER.

Падение твоей программы не имеет ничего общего с аантивирусом.


эээ...... а к чему имеет?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъа к чему имеет?

К багу в ней. Запускай под отладчиком, смотри call stack при падении.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134201
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъа к чему имеет?

К багу в ней. Запускай под отладчиком, смотри call stack при падении.


Сомневаюсь, т.к. в программе для теста оставил 3 строчки.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134203
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день.


Пытаюсь забить программу на несколько файлов.

Надо объявить структуру чтобы она была доступна во всех частях программы (разные файлы)


Было вот так:


main.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "header.h"

#define N 1500



int main()
{



struct pair {
	char* name;
	char* ip;
};

struct pair *arr = malloc(sizeof(struct pair) * N);



	return 0;
}





header.h

Код: plaintext
1.
2.
3.
4.
5.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134205
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выношу в header:


header.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>

struct pair {
	char* name;
	char* ip;
};




в main остается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include "header.h"

#define N 1500



int main()
{

struct pair *arr = malloc(sizeof(struct pair) * N);



	return 0;
}





И нормально работает.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134206
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но как только дописываю

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
И нормально работает.

Почему оно не должно работать? Оба варианта верны.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134208
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
И нормально работает.

Почему оно не должно работать? Оба варианта верны.



А с точки зрения доступность из других файлов, это нормальный вариант, без extern ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134209
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
но как только дописываю

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?

extern убери, он у тебя лишний. extern обозначает что искать объявление в другом месте.

PS Ты бы книжку какую почитал, это азы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134210
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
но как только дописываю

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?

extern убери, он у тебя лишний. extern обозначает что искать объявление в другом месте.

PS Ты бы книжку какую почитал, это азы.



Я просто про переменные читал, что их надо extern делать.

Ну читать еще и читать )))

Большое спасибо!!!
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134211
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В начале каждого .h файла ставь
Код: plaintext
1.
#pragma once


это чтобы препроцессор дважды не включил твой .h

И про препроцессор почитай
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134216
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
В начале каждого .h файла ставь
Код: plaintext
1.
#pragma once


это чтобы препроцессор дважды не включил твой .h

И про препроцессор почитай


включил.

читаю :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134217
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъСомневаюсь, т.к. в программе для теста оставил 3 строчки.

Багу достаточно одной. Трёх - мало для осмысленного функционирования программы,
работающей с БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134219
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

еще такой вопрос, тестирую сколько памяти может выделиться для структуры:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include "header.h"

#define N 1500



int main()
{

struct pair *arr = malloc(sizeof(struct pair) * N);
if (NULL == arr ) {printf("Memory does not given.\n");exit(1);}


	return 0;
}





Если ставлю в 1000000 раз больше, то память не выделяется:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * N * 1000000);




Но это же не обльше чем память на сервере, на сервере 8 Гб доступно, а они не выделяются.

Я так понимаю это идет занятие памяти стека, а она маленькая.

Подскажите пожалуйста как воспользоваться не памятью стека при выделении, а общей памятью на сервере?

Ну или я что-то путаю (
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134228
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты не указал какой битности у тебя код. Будем считать что x64, тогда sizeof(struct pair) = 16 байт, и всего
Код: plaintext
1.
sizeof(struct pair) * N * 1000000 = 24 000 000 000


24 Гб свободной памяти у тебя просто нет, как минимум поэтому не дает выделить столько памяти.

В 32-битных было просто, адресное пространство процесса позволяет выделить максимум 1.7 Гб, и они выделялись даже если памяти не хватало, остальное свопилось.

В x64 адресное пространство не ограничивает, поэтому придуманы какие-то хитрые алгоритмы искусственного ограничения, т.к. одна кривая прога запросто может занять всю память и своп в придачу. Какие ограничения, как их обходить, я не вникал, в каждой ОС свои правила.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134232
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо ip можно поставить беззнаковое целое число.

Код: plaintext
1.
2.
3.
4.
struct pair {
	char* name;
	DWORD32 ip;
};



Это сэкономит память. Есть формулы трансляции из строк типа "192.168.0.1" в целые числа и обратно.

Но мне кажется что тебе не стоит сразу кушать слона. Поработай хотя-бы с 1000 штук таких пар.
Отшлифуй просто корректную работу. А уже потом - растягивай до мильярдов.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъНу или я что-то путаю (

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

Даже если бы sizeof(pair) было 1 байт, то ты пытался бы выделить 1500000000
байт. Что, внезапно, полтора гигабайта. У тебя pair - 16 байт. Простая
арифметика и вуаля - мы видим попытку выделить 24 гигабайта при доступных восьми.

Но, как верно упомянул тёзка, тебе мог бы прийти на помощь своп. Если бы ты не
пытался скомпилировать 32-х разрядное приложение, где sizeof(pair) - 8 байт. Что
сокращает потуги до 12 гигабайт при максимально доступном адресном пространстве
в четыре (практически не более двух, максимум трёх).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134239
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Ты не указал какой битности у тебя код. Будем считать что x64, тогда sizeof(struct pair) = 16 байт, и всего
Код: plaintext
1.
sizeof(struct pair) * N * 1000000 = 24 000 000 000


24 Гб свободной памяти у тебя просто нет, как минимум поэтому не дает выделить столько памяти.

В 32-битных было просто, адресное пространство процесса позволяет выделить максимум 1.7 Гб, и они выделялись даже если памяти не хватало, остальное свопилось.

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


Ого, я не думал что прям 24 гига....

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

Спасибо за разьяснение.

Раз вся память доступна - это хорошо!
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134240
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

УткъНу или я что-то путаю (

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

Даже если бы sizeof(pair) было 1 байт, то ты пытался бы выделить 1500000000
байт. Что, внезапно, полтора гигабайта. У тебя pair - 16 байт. Простая
арифметика и вуаля - мы видим попытку выделить 24 гигабайта при доступных восьми.

Но, как верно упомянул тёзка, тебе мог бы прийти на помощь своп. Если бы ты не
пытался скомпилировать 32-х разрядное приложение, где sizeof(pair) - 8 байт. Что
сокращает потуги до 12 гигабайт при максимально доступном адресном пространстве
в четыре (практически не более двух, максимум трёх).


я немного туповат просто (

прошу принять это и простить.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134241
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Вместо ip можно поставить беззнаковое целое число.

Код: plaintext
1.
2.
3.
4.
struct pair {
	char* name;
	DWORD32 ip;
};



Это сэкономит память. Есть формулы трансляции из строк типа "192.168.0.1" в целые числа и обратно.

Но мне кажется что тебе не стоит сразу кушать слона. Поработай хотя-бы с 1000 штук таких пар.
Отшлифуй просто корректную работу. А уже потом - растягивай до мильярдов.


Да, сначала надо сделать все просто, потому уже оптимизировать, когда будет что оптимизировать )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134246
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно. Вот потом почитай

https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_pton
...
Рейтинг: 0 / 0
25 сообщений из 308, страница 11 из 13
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]