Форум программистов, компьютерный форум CyberForum.ru

хитрая константа не даёт создать обычный массив - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Массивы и натуральные числа http://www.cyberforum.ru/cpp-beginners/thread391748.html
Помогите пожалуйста написать программу. Ввести натуральное число n. а) Записать в массив только те делители числа n, которые являются палиндромами. б) Вывести все делители числа n, у которых последняя цифра наименьшая. Заранее спасибо.
C++ Класс "Список", функция добавления элемента в конец #include <iostream> #include <cstring> using namespace std; struct myElem { char *line; myElem *next; myElem(const char* str) http://www.cyberforum.ru/cpp-beginners/thread391731.html
C++ Вывести все целые числа, расположенные между заданными
Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (включая сами эти числа), в порядке их убывания. Использовать цикл for. #include <stdio.h> #include <conio.h> void main() { int a,b,i; clrscr(); printf("vvedite a: "); scanf("%i",&a);
C++ Проверьте, пожалуйста, правильность составленного мной алгоритма)
Вот код: #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { FILE *fp; int n, i, min, number, sum, a; char fname = "D:\\file.txt";
C++ #pragma once http://www.cyberforum.ru/cpp-beginners/thread391715.html
Можно ли считать директиву #pragma once полноценно заменой техники #ifndef MYFILE_H #define MYFILE_H ... #end if
C++ Ошибка сегментации. Здравствуйте, дорогие форумчане! Тут такое дело, есть программа, код приведен ниже, там есть некоторый массив D. После компиляции программы вместе с этим массивом, программа вылетает, выдав ошибку Без неё, программа компилируется, выполняет циклы и успешно завершает работу. Проверил отладчиком, выдало "ошибку сегментации". Увеличил размер стека, тож не помогло. Чё делать? #include... подробнее

Показать сообщение отдельно
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 21:25     хитрая константа не даёт создать обычный массив
Bers,
C++
1
2
3
4
int Array[100]; //живет в куче, а не на стеке.
//хотя его размер так же должен быть известен на этапе компиляции.
 
int main(){   return Array[0];};
Bash
1
2
3
alexxx@alexxx-laptop:~/c++$ g++ -g 2.cpp 
alexxx@alexxx-laptop:~/c++$ readelf -a a.out | grep Array
    59: [B]0804a040[/B]   400 OBJECT  GLOBAL DEFAULT   26 Array
Bash
1
2
alexxx@alexxx-laptop:~/c++$ objdump -d a.out > dump
alexxx@alexxx-laptop:~/c++$ less dump
Bash
1
2
3
4
5
6
7
8
08048494 <main>:
 8048494:       55                      push   %ebp
 8048495:       89 e5                   mov    %esp,%ebp
 8048497:       a1 40 a0 04 08          mov    0x804a040,%eax
 804849c:       5d                      pop    %ebp
 804849d:       c3                      ret    
 804849e:       90                      nop
 804849f:       90                      nop
в данном случае массив выделен на момент компиляции, ни о каком heap'е речь не идет
адрес массива зафиксирован за 0x804a040
подобная ситуация и для локальных статических массивов и каких-то других вариантов

второй вариант
Bash
1
2
3
4
5
6
7
8
9
alexxx@alexxx-laptop:~/c++$ cat 2.cpp
 
int main(){   
    int Array[100];
    return Array[0];
}
alexxx@alexxx-laptop:~/c++$ g++ -g 2.cpp 
alexxx@alexxx-laptop:~/c++$ readelf -a a.out | grep Array
alexxx@alexxx-laptop:~/c++$
видим, что под массив не было зарезервировано памяти

Bash
1
2
alexxx@alexxx-laptop:~/c++$ objdump -d a.out > dump
alexxx@alexxx-laptop:~/c++$ less dump
Bash
1
2
3
4
5
6
7
8
9
10
08048494 <main>:
 8048494:       55                      push   %ebp
 8048495:       89 e5                   mov    %esp,%ebp
 8048497:       81 ec 90 01 00 00       sub    $0x190,%esp
 804849d:       8b 85 70 fe ff ff       mov    -0x190(%ebp),%eax
 80484a3:       c9                      leave  
 80484a4:       c3                      ret    
 80484a5:       90                      nop
 80484a6:       90                      nop
 80484a7:       90                      nop
тут конечно какие хитрости, но видно, что массив появляется только за счет сдвига указателя стека
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru