Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
#1

Расчленяем строковые литералы - C (СИ)

17.08.2014, 02:37. Просмотров 407. Ответов 3
Метки нет (Все метки)

C
1
char* str1 = "abc";
эквивалентен
C
1
2
static char const __tmp_obj1[] = "abc";//константный указатель на массив
char* str1 = &__tmp_obj1[0];
но почему тогда следующий код не выдает ошибку??

C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
int main(){
    char* str1 = "abc";
    str1="efg";//тут меняем адрес, по логике должна быть ошибка
 
    system("pause");
    return 0;
}
PS:Брал инфу отсюда:
http://www.cyberforum.ru/blogs/18334/blog97.html

http://www.cyberforum.ru/c-beginners/thread1825257.html

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2014, 02:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Расчленяем строковые литералы (C (СИ)):

Константы (литералы) типа int
Всем привет!) У меня возможно глупый вопросы, но мы же все когда-то учились)...

Литералы, поиск чисел с целой и дробной частью
в исходной стpоке ищутся и pаспечатываются в столбик все последовательности...

Си строковые команды
Если можете помогите с этими функциями: Напишите функцию, которая возвращает...

Строки и строковые функции
Пожалуйста помогите написать задачу ледующего типа: Слова в предложении...

Строковые константы - Too many initializers for 'char []'
P.S плохо с русским Парни кто может мне помочи....со строковыми константы...

3
Jewbacabra
Эксперт PHP
3088 / 2675 / 1222
Регистрация: 24.04.2014
Сообщений: 8,187
17.08.2014, 02:47 #2
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
тут меняем адрес, по логике должна быть ошибка
а почему должна быть ошибка? str1 не является константным указателем
0
Andrej
И целого heap'а мало
94 / 55 / 17
Регистрация: 31.07.2014
Сообщений: 291
17.08.2014, 23:11 #3
В сях дело со строками обстоит весьма хитро. Со стороны программиста строковый литерал - это штука с const char* в начале. Компилятор живёт по своим правилам.
Например, вот этот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
const char* con_str = "const_str"; /* константа, литерал */
 
int
main()
{
        puts(con_str);
        char* str = "abs"; /* переменная, по ходу дела указывает на литерал */
        puts(str);
        str = "efgd"; /* поменяли значение переменной, указывающей на участок памяти, но литерал остался на месте */
        puts(str);
};
компилятор (gcc 4.8 под линухом x64) перегонит в это:
Assembler
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
    .file   "literal.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "abs" ; первый литерал
.LC1:
    .string "efgd" ; второй
    .text
    .globl  main
    .type   main, @function
main:
.LFB24:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movq    con_str(%rip), %rdi ; константа
    call    puts
    movl    $.LC0, %edi ; переменная str в регистре edi (логически) и в неё положен адрес первого литерала
    call    puts
    movl    $.LC1, %edi ; меняется значение переменной на адрес другого литерала
    call    puts
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE24:
    .size   main, .-main
    .globl  con_str
    .section    .rodata.str1.1
.LC2:
    .string "const_str" ; третий, указан литералом согласно сяшному соглашению, потому помещён сюда
    .data
    .align 8
    .type   con_str, @object
    .size   con_str, 8
con_str:
    .quad   .LC2 ; и имеет такую метку
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits
Компилятор - весёлая штука: говоришь ему создать переменную, а куда он её запихнёт - вопрос.
Всё строковые литералы помещаются в константную область памяти и получают метки, но это под капотом.
Как ты распорядишься своими переменными - другое дело.
0
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 409
17.08.2014, 23:40  [ТС] #4
Andrej,хотел написать баг, но не то, поетому просто спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2014, 23:40
Привет! Вот еще темы с решениями:

Строковые массивы, сравнение и вывод
Здравствуйте, у меня вопрос касаемо этого задания: Нужна программа...

Символьные (или строковые?) массивы
Всем привет. Сразу попрошу, если не трудно, не кидайте в меня какашками. Я...

строки символов и строковые контстанты
Не где не могу найти четкого ответа на эти два вопроса, везде какие-то...

Строковые данные: определить сколько раз каждая буква встречается в тексте
всем привет,помогите плиз. Ввести с клавиатуры несколько (от 3 до 5 букв) и...


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

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

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