почему c позволяет инициализацию строки без объявления?

Когда аргументы dyn_mat являются константами, код выполняется без ошибок, а s1 и s2 сохраняют входные значения.

#include

int main(int argc, char const *argv[])
{
    char *s1, *s2;
    int n1=7, n2=8;
    printf("Enter, %d \n", n1);

    scanf("%s", s1);
    scanf("%s", s2);

    int dyn_mat[155][347];

    return 0;
}

но с аргументами в качестве переменных, скажем, n1 и n2, чтение Scanf s1 дает ошибку сегментации.

 Mat27 окт. 2012 г., 14:01
С неЯ не могу этого допустить. Ваш код имеет неопределенное поведение. "
 dasblinkenlight27 окт. 2012 г., 14:06
Когда [размеры]dyn_mat являются константами, код проходит без ошибок иs1 а такжеs2 сохранить входные значения. Но с аргументами в качестве переменных, скажем, n1 и n2, чтение Scanf s1 дает ошибку сегментации ". Код выполняется с одинаковой серьезной ошибкой в обоих случаях, вы просто не видите ее последствий.

Ответы на вопрос(2)

неопределенное поведение, посколькуs1 а такжеs2 не являются действительными указателями.scanf ожидает указатель на массив символов, которые 'достаточно большой, чтобы содержать прочитанные данные, и вы не предоставляете такие указатели.

Обычный способ будет примерно таким:

char s1[1000];
char s2[1000];

scanf("%s", s1);
scanf("%s", s2);

(Хотя вы должны использовать более безопасную версию, которая указывает доступный размер буфера, а не надеяться, что ввод будет достаточно коротким; например,scanf("%999s", s1);.)

 joe28 окт. 2012 г., 15:26
@icepack I 'я не уверен в этомразвращает что-то еще в вашей системе, и этоЭто определенно не касается ОС. Процессы имеют адресное пространство, и нарушение доступа также приведет к ошибке сегментации. УвидетьЧто такое ошибка сегментации?
 tunetopj27 окт. 2012 г., 14:17
но когда я даю постоянные аргументы, почему это работает каждый раз, а s1 и s2 всегда сохраняют входные значения без каких-либо проблем.
 SomeWittyUsername27 окт. 2012 г., 14:26
s1 и s2 указывают на некоторую произвольную область в памяти. Ваш код перезаписывает все, что там присутствует. Ты нене вижу проблем вваша программа потому что, скорее всего, эффект где-то еще и повреждает что-то еще в вашей системе.
 SomeWittyUsername28 окт. 2012 г., 15:31
@porkshoulder, который на самом деле зависит от рабочей среды, что выговорит неисправить для встроенного кода или кода ядра (или DOS! :)). В этом случае, однако, выВозможно, это правильно, поскольку это выглядит как стандартный код пользовательского пространства, который выполняется в защищенной среде, поэтому повреждение будет происходить внутри запущенного процесса
Решение Вопроса

Нет типа данныхstring в С.

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

Ваша программа не объявляет какой-либо массив, а просто указывает на символы, которым не назначена память, в которую вы копируете данные.scanf()

Ваша просто везучая программа не вылетает при первом вызове.scanf()

Ваш ответ на вопрос