2013-02-26 3 views

ответ

5

Да.

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

const char* string = "name"; 

Второй создает массив достаточно долго, чтобы держать строку "name" (так, четыре символа плюс один для null terminator) и копирует строку внутри выделенного пространства.

0
#include <stdio.h> 

int main(int argc, const char** argv) 
{ 
    const char *a1 = "hello"; 
    const char a2[] = "hello"; 
    char* b1; 
    char* b2; 

    b2 = (char*) a2; 
    *b2 = 'c'; 
    puts(b2); 

    b1 = (char*)a1; 
    *b1 = 'c'; 
    puts(b1); 


    return 0; 
} 

b2 будет отображать «виолончель» должным образом. b1 вызовет ошибку сегментации.

Это связано с тем, что b1 хранится в текстовом сегменте кода, тогда как b2 хранится в сегменте данных.

я надеюсь, что я не испортить его ...

также, компилятор может сделать магию, чтобы сделать это недействительным признание того, что что-то объявляется на текстовом сегменте, но доступен в коде, так что C иногда цепляется, и объявление изменений в сегменте данных

Смежные вопросы