Си: передача предопределённых строк в функцию

Всегда думал, что при предопределении строковой переменной *s = "habr" и s[] = "habr" — практически полные синонимы.

Тогда почему в коде ниже (компилировал в GCC, различные версии, на Linux) работает лишь вариант I, а варианты II и III валятся с Segmentation Fault?

// Вариант I

#include <stdio.h>

void test(char *s) {
    s[2] = 'X';
    puts(s);
}

int main() {
    char x[] = "123456";
    
    test(x);
    return 0;
}


// Вариант II

#include <stdio.h>

void test(char *s) {
    s[2] = 'X';
    puts(s);
}

int main() {
    char *x = "123456";
    
    test(x);
    return 0;
}


// Вариант III

#include <stdio.h>

void test(char *s) {
    s[2] = 'X';
    puts(s);
}

int main() {
    test("123456");
    return 0;
}


Возможно, это что-то элементарное для языка, но сам я не разобрался.
  • Вопрос задан
  • 6580 просмотров
Решения вопроса 1
Livid
@Livid
Дело в разнице между массивами и указателями. Она, вообще говоря, есть.

При инициализации
char array[] = «abc» выделяет память для нового строкового массива и устанавливает его элементы в «a»,«b»,«c» и "\0"
char *pointer = «abc» устанавливает pointer на строку «abc», которая, вообще говоря, может находиться (как строковой литерал) в защищенной области памяти (i.e. только для чтения).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час