Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

Указатель на строковую константу - C++

07.09.2013, 20:28. Просмотров 1108. Ответов 23
Метки нет (Все метки)

Здравствуйте уважаемые форумчане!

Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива автоматически подгоняется?:
C++
1
2
char * ptr = new char;
ptr = "I am massive";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2013, 20:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на строковую константу (C++):

Указатель на строковую константу - C++
Всем привет. Я знаю что в С++ в основном юзается std::string,но сишные строки тоже желательно знать. Вроде все просто, только функции...

Указатель на строковую константу. В чем отличие двух приведенных примеров - C++
char *x; x = "Текст"; это указатель на строковую константу. char x="Текст"; - строка(т.е. массив символов). В чём отличие...

Как в классе создать строковую константу? - C++
Как в классе создать строковую константу? Конструкция типа static const char __tmp_obj1 = "abc"; не работает.

Преобразование в указатель на указатель на константу - C++
В упор не могу понять правила которые приводит Дьюхерст для преобразований "многоуровневых" указателей. (Дьюхерст "Скользкие места...

Константный указатель на константу меняет значение - C++
int d = 7; const int* const cd = &d; d = 8; qDebug()<<*cd;

ссылка на указатель на константу. Не могу врубиться - C++
Добрый вечер! Не подскажите почему только выражение с pi_ref3 верное, а остальные - нет (VS 2013). Выражение с pi_ref1 вроде как-то...

23
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
08.09.2013, 01:10 #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
нет, как не крути это будет не хип, возможно стек,
точно не стек
секция данных, может кода(борланд любит все туда впихивать) в любом случае будет на диске лежать и загружаться при запуске программы, тем более глобальная константа
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
08.09.2013, 01:39 #17
Цитата Сообщение от Croessmah Посмотреть сообщение
Да даже если бы не потерял, delete [] не прокатил бы.
потому что статический массив. мой пост был целиком лишен смысла

Добавлено через 9 минут
Цитата Сообщение от alex_x_x Посмотреть сообщение
нет, как не крути это будет не хип, возможно стек, но скорее всего другая секция

C++
1
2
3
4
5
6
7
8
#include <cstdio>
 
const char* var = "hello world";
 
int main ()
{
    printf ("%s", var);
}
Bash
1
2
3
> g++ -g 4.cpp
> nm -a ./a.out| grep var
0000000000601028 D var
лол. ну так вы ее как const объявили. вот она у вас в сегменте данных и оказалась. в сегменте данных как раз находятся константы и статические переменные. и сегмент данных - это тоже не стек.

если переменная-указатель не константа (как у автора) оператор new выделяет место именно в heap.
а сама переменная указатель в стеке.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2013, 01:48 #18
Цитата Сообщение от fit Посмотреть сообщение
лол. ну так вы ее как const объявили. вот она у вас в сегменте данных и оказалась. в сегменте данных как раз находятся константы и статические переменные. и сегмент данных - это тоже не стек.
если переменная-указатель не константа оператор new выделяет место именно в heap.
а сама переменная указатель в стеке.
здесь "hello world" тоже в хипе? или где?
C++
1
2
3
4
5
6
#include <cstdio>                  
                                   
int main ()                        
{                                  
    printf ("%s", "hello world");  
}
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.09.2013, 01:49 #19
fit, лол, какая разница, какого типа переменная-указатель, строковый литерал - это всегда константа.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2013, 02:02 #20
ладно, вообщем как я люблю такие самоуверенные выводы

C++
1
2
3
4
5
6
7
8
#include <cstdio>
 
int main ()
{
    int a = 10;
    int * b = new int (100);
    printf ("%s", "hello world");
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Breakpoint 1, main () at 4.cpp:5               
5           int a = 10;                        
 
(gdb) x/a &a                                   
0x7fffffffde64: 0x7fff                                     
(gdb) n                                        
6           int * b = new int (100);           
(gdb) n                                        
7           printf ("%s", "hello world");      
(gdb) p/x b                                    
$3 = 0x602010                                  
(gdb) disassemble                              
Dump of assembler code for function main():                 
0x000000000040068c <main()+0>:  push   %rbp                 
0x000000000040068d <main()+1>:  mov    %rsp,%rbp            
0x0000000000400690 <main()+4>:  sub    $0x10,%rsp           
0x0000000000400694 <main()+8>:  movl   $0xa,-0xc(%rbp)      
0x000000000040069b <main()+15>: mov    $0x4,%edi            
0x00000000004006a0 <main()+20>: callq  0x400590 <_Znwm@plt> 
0x00000000004006a5 <main()+25>: movl   $0x64,(%rax)         
0x00000000004006ab <main()+31>: mov    %rax,-0x8(%rbp)      
0x00000000004006af <main()+35>: mov    $0x4007c4,%esi       
0x00000000004006b4 <main()+40>: mov    $0x4007d0,%edi       
0x00000000004006b9 <main()+45>: mov    $0x0,%eax            
0x00000000004006be <main()+50>: callq  0x400560 <printf@plt>
0x00000000004006c3 <main()+55>: mov    $0x0,%eax            
0x00000000004006c8 <main()+60>: leaveq                      
0x00000000004006c9 <main()+61>: retq                        
End of assembler dump.                                      
(gdb) x/s 0x4007c4                     
                                       
0x4007c4:        "hello world"         
(gdb) x/s 0x4007d0                     
                                       
0x4007d0:        "%s"                  
(gdb) info proc mappings                                                                                           
process 27712                                                                                                      
...                                                                              
Mapped address spaces:                                                                                             
                                                                                                                   
          Start Addr           End Addr       Size     Offset objfile                                              
            0x400000           0x401000     0x1000          0                             /home/*/a.out    
            0x600000           0x601000     0x1000          0                             /home/*/a.out    
            0x601000           0x602000     0x1000     0x1000                             /home/*/a.out    
            0x602000           0x623000    0x21000          0                                   [heap]             
      0x7ffff7308000     0x7ffff745d000   0x155000          0                      /lib64/libc-2.11.1.so           
      0x7ffff745d000     0x7ffff765c000   0x1ff000   0x155000                      /lib64/libc-2.11.1.so           
      0x7ffff765c000     0x7ffff7660000     0x4000   0x154000                      /lib64/libc-2.11.1.so           
      0x7ffff7660000     0x7ffff7661000     0x1000   0x158000                      /lib64/libc-2.11.1.so           
      0x7ffff7661000     0x7ffff7666000     0x5000          0                                                      
      0x7ffff7666000     0x7ffff767c000    0x16000          0                      /lib64/libgcc_s.so.1            
      0x7ffff767c000     0x7ffff787b000   0x1ff000    0x16000                      /lib64/libgcc_s.so.1            
      0x7ffff787b000     0x7ffff787c000     0x1000    0x15000                      /lib64/libgcc_s.so.1            
      0x7ffff787c000     0x7ffff787d000     0x1000    0x16000                      /lib64/libgcc_s.so.1            
      0x7ffff787d000     0x7ffff78d2000    0x55000          0                      /lib64/libm-2.11.1.so           
      0x7ffff78d2000     0x7ffff7ad1000   0x1ff000    0x55000                      /lib64/libm-2.11.1.so           
      0x7ffff7ad1000     0x7ffff7ad2000     0x1000    0x54000                      /lib64/libm-2.11.1.so           
      0x7ffff7ad2000     0x7ffff7ad3000     0x1000    0x55000                      /lib64/libm-2.11.1.so           
      0x7ffff7ad3000     0x7ffff7bc3000    0xf0000          0                     /usr/lib64/libstdc++.so.6.0.10   
      0x7ffff7bc3000     0x7ffff7dc2000   0x1ff000    0xf0000                     /usr/lib64/libstdc++.so.6.0.10   
      0x7ffff7dc2000     0x7ffff7dc9000     0x7000    0xef000                     /usr/lib64/libstdc++.so.6.0.10   
      0x7ffff7dc9000     0x7ffff7dcb000     0x2000    0xf6000                     /usr/lib64/libstdc++.so.6.0.10   
      0x7ffff7dcb000     0x7ffff7dde000    0x13000          0                                                      
      0x7ffff7dde000     0x7ffff7dfd000    0x1f000          0                      /lib64/ld-2.11.1.so             
      0x7ffff7fbe000     0x7ffff7fc2000     0x4000          0                                                      
      0x7ffff7ffa000     0x7ffff7ffb000     0x1000          0                                                      
      0x7ffff7ffb000     0x7ffff7ffc000     0x1000          0                           [vdso]                     
      0x7ffff7ffc000     0x7ffff7ffd000     0x1000    0x1e000                      /lib64/ld-2.11.1.so             
      0x7ffff7ffd000     0x7ffff7ffe000     0x1000    0x1f000                      /lib64/ld-2.11.1.so             
      0x7ffff7ffe000     0x7ffff7fff000     0x1000          0                                                      
      0x7ffffffea000     0x7ffffffff000    0x15000          0                           [stack]                    
  0xffffffffff600000 0xffffffffff601000     0x1000          0                   [vsyscall]                         
(gdb) info registers                                 
rax            0x602010 6299664                      
rbx            0x4006e0 4196064                      
rcx            0x7ffff7661e60   140737344052832      
rdx            0x602000 6299648                      
rsi            0x21000  135168                       
rdi            0x602000 6299648                      
rbp            0x7fffffffde70   0x7fffffffde70       
rsp            0x7fffffffde60   0x7fffffffde60       
r8             0x7ffff7661e60   140737344052832      
r9             0x0      0                            
r10            0x887b0  559024                       
r11            0x206    518                          
r12            0x4005a0 4195744                      
r13            0x7fffffffdf40   140737488346944      
r14            0x0      0                            
r15            0x0      0                            
rip            0x4006af 0x4006af <main()+35>         
eflags         0x206    [ PF IF ]                    
cs             0x33     51                           
ss             0x2b     43                           
ds             0x0      0                            
es             0x0      0                            
fs             0x0      0                            
gs             0x0      0                            
fctrl          0x37f    895                          
fstat          0x0      0                            
ftag           0xffff   65535                        
fiseg          0x0      0                            
fioff          0x0      0                            
foseg          0x0      0                            
fooff          0x0      0                            
fop            0x0      0                            
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]
КО говорит, что "hello wolrld" выделен в заранее подготовленной области памяти 0x4007c4 лежит в ( 0x400000 0x401000 )
а, судя по адресу и стековым регистрам - на стеке
b - в хипе (0x602010 лежит между 0x602000 0x623000, что помечено как хип)
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
08.09.2013, 02:16 #21
Цитата Сообщение от alex_x_x Посмотреть сообщение
b - в хипе (0x602010 лежит между 0x602000 0x623000, что помечено как хип)
не совсем так в куче у тебя 100 интов, выделенная память а b, указатель на выделенную память, лежит в стеке
вот она сохраняется
Цитата Сообщение от alex_x_x Посмотреть сообщение
0x00000000004006a5 <main()+25>: movl * $0x64,(%rax)
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
08.09.2013, 02:17 #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
здесь "hello world" тоже в хипе? или где?
C++
1
2
3
4
5
6
#include <cstdio>                  
                                   
int main ()                        
{                                  
    printf ("%s", "hello world");  
}
о каком heap может идти речь, если в обоих ваших программах отсутствует new?))
моя реплика, которую вы цитировали относилась к вопросу автора по своему первому коду:
C++
1
char * ptr = new char;
моя ошибка в том, что я вслед за автором назвал это строковой константой. хотя это обычный char массив/
как я уже сказал, все статические переменные и константы лежат в сегменте данных
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2013, 02:22 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
не совсем так в куче у тебя 100 интов, выделенная память а b, указатель на выделенную память, лежит в стеке
вот она сохраняется
пардон, я распечатываю значение b, которое указывает на адрес в хипе
я не печатаю адрес b

Цитата Сообщение от fit Посмотреть сообщение
моя ошибка в том, что я вслед за автором назвал это строковой константой. хотя это обычный char массив/
как я уже сказал, все статические переменные и константы лежат в сегменте данных
ок, тогда договоримся, что строковые литералы лежает не в хипе
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
08.09.2013, 02:24 #24
Цитата Сообщение от ValeryS
а b, указатель на выделенную память, лежит в стеке
именно так. иначе быть и не может. в стеке - адрес первого элемента (указатель). в heap непосредственно сам массив

Добавлено через 1 минуту
Цитата Сообщение от alex_x_x
ок, тогда договоримся, что строковые литералы лежает не в хипе
не в хипе. я применил неправильный термин
0
08.09.2013, 02:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 02:24
Привет! Вот еще темы с ответами:

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.