Всегда думал, что при предопределении строковой переменной
*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;
}
Возможно, это что-то элементарное для языка, но сам я не разобрался.