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

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

Восстановить пароль Регистрация
 
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
07.09.2013, 20:28     Указатель на строковую константу #1
Здравствуйте уважаемые форумчане!

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

Преобразование в указатель на указатель на константу C++
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
Указатель на строковую константу. В чем отличие двух приведенных примеров C++
Приведение любого двумерного массива к типу указатель на указатель C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
07.09.2013, 20:36     Указатель на строковую константу #2
ptr - это вообще не массив, и он указывает на первый символ строки
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
07.09.2013, 20:42     Указатель на строковую константу #3
Цитата Сообщение от BESSON_off Посмотреть сообщение
Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива автоматически подгоняется?:
1) Вы выделили место под один символ.
2) Вы просто взяли и поменяли адрес, содержащийся в указателе.
3) Это утечка памяти
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
07.09.2013, 20:56  [ТС]     Указатель на строковую константу #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы просто взяли и поменяли адрес, содержащийся в указателе
То есть строковая константа расположилась в стековой памяти?
Смысл этой записи аналог этому (утечка памяти опущена)?:
C++
1
2
3
char * ptr;
char mas[] = "I am massive";
ptr = mas;
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:19     Указатель на строковую константу #5
строковая константа находится в оперативной памяти (heap), а переменная-указатель (ptr) таки да - в стековой.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
07.09.2013, 21:20     Указатель на строковую константу #6
C++
1
2
3
4
5
6
char * ptr; /* ты создал указатель ptr, но память под него не выделил, он указывает ни на что, на NULL */
char mas[] = "I am massive"; /* ты создал массив mas */
ptr = mas; /* ты присвоил указателю ptr адрес массива mas, 
теперь если ты изменишь *ptr то изменится и mas, 
а если изменишь mas то изменится и *ptr т.к. это один и тот же объект, 
ну всмысле одно объект, а второе указатель на этот объект. */
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:25     Указатель на строковую константу #7
не будет в общем никакой утечки, ты просто создал указатель на массив.
но при удалении массива его тоже надо будет удалить
C++
1
2
delete [] mas;
delete ptr;
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.09.2013, 21:30     Указатель на строковую константу #8
Цитата Сообщение от fit Посмотреть сообщение
но при удалении массива его тоже надо будет удалить
чего
ты хоть один new видел?
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
07.09.2013, 21:34     Указатель на строковую константу #9
Цитата Сообщение от ValeryS Посмотреть сообщение
чего
ты хоть один new видел?
лол, точно. спросоня с первым постом автора попутал))
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.09.2013, 21:59     Указатель на строковую константу #10
Цитата Сообщение от fit Посмотреть сообщение
лол, точно. спросоня с первым постом автора попутал))
да даже если попутал
удалять то нечего, он указатель потерял
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.09.2013, 22:00     Указатель на строковую константу #11
Цитата Сообщение от VLK Посмотреть сообщение
он указывает ни на что, на NULL
в указателе мусор, а не NULL
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
07.09.2013, 22:27     Указатель на строковую константу #12
Цитата Сообщение от Jupiter Посмотреть сообщение
в указателе мусор, а не NULL
тоже верно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
07.09.2013, 23:27     Указатель на строковую константу #13
Цитата Сообщение от fit Посмотреть сообщение
C++
1
delete [] mas;
Цитата Сообщение от fit Посмотреть сообщение
спросоня с первым постом автора попутал))
Цитата Сообщение от ValeryS Посмотреть сообщение
удалять то нечего, он указатель потерял
Да даже если бы не потерял, delete [] не прокатил бы.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
08.09.2013, 00:29     Указатель на строковую константу #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Да даже если бы не потерял, delete [] не прокатил бы.
то же правильно
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.09.2013, 01:04     Указатель на строковую константу #15
Цитата Сообщение от fit Посмотреть сообщение
строковая константа находится в оперативной памяти (heap)
нет, как не крути это будет не хип, возможно стек, но скорее всего другая секция

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
"D"
"d" The symbol is in the initialized data section.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
08.09.2013, 01:10     Указатель на строковую константу #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
нет, как не крути это будет не хип, возможно стек,
точно не стек
секция данных, может кода(борланд любит все туда впихивать) в любом случае будет на диске лежать и загружаться при запуске программы, тем более глобальная константа
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.
а сама переменная указатель в стеке.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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");  
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 01:49     Указатель на строковую константу #19
fit, лол, какая разница, какого типа переменная-указатель, строковый литерал - это всегда константа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 02:02     Указатель на строковую константу
Еще ссылки по теме:

Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
C++ Указатель на строковую константу
C++ Как правильно удалять выделенную память под указатель на указатель?

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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, что помечено как хип)
Yandex
Объявления
08.09.2013, 02:02     Указатель на строковую константу
Ответ Создать тему
Опции темы

Текущее время: 02:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru