Хм ... есть несколько ошибки в этом коде. Давайте начнем с наиболее очевидным ваш компилятор жалуется:
char *arr[3];
Эта строка объявляет arr
быть массивом из трех указателей к char
. То, что вы возвращаете из своей функции, - это единственный указатель на char
-> не соответствует.
Следующая:
static char arr[3];
sprintf(arr, "%s\n", "abc")
Здесь Вы резерве 3 char
с. sprintf()
будет писать 5 char
s.%s
заменяется на 3 символа в вашем строчном литерале"abc"
. Вы добавляете символ новой строки, а затем добавляется 0
в качестве маркера конца «строки». Делает 5. Это btw равно undefined поведение. Вы пишете конец вашего массива. Код, подобный этому , может быть скомпилирован, но нет никакой гарантии о том, что произойдет во время выполнения.
делает сократить здесь. Вы должны прочитать о массивах и указателях на C. Если текст, который вы читаете, утверждает, что он тот же ... остановитесь прямо там и найдите лучший текст. Это не так.
Я попытаюсь объяснить это здесь кратко, поэтому он подходит для Q & A стиль.
Массив в C действительно является смежным пространством нескольких значений. char arr[3]
означает переменную, которая содержит 3 char
s.
С другой стороны, char *
это просто указатель, указывающий на char
- это может быть первым элементом массива.
В C вы не можете передавать массивы в качестве параметров функции, и вы не можете возвращать массивы из функции. Попытка сделать это приводит к неявному преобразованию: What is Фактически передано является указателем на первый элемент этого массива.
Я думаю, что последний бит информации, отсутствующей является то, что в C строковый литерал является: это массив (анонимный, например, он не имеет имени), содержащий все символы в двойных кавычках плюс a 0
прилагается. 0
обозначает конец «строки» в C.
В выражении строковый литерал оценивает указатель на первый элемент.
Так, что-то вроде этого:
char *foo = "bar";
приведет к foo
указывая на b
массива. Это как письмо
static const char no_name_0[] = { 'b', 'a', 'r', 0 };
char *foo = &(no_name_0[0]);
'char * arr [3]' - массив из трех символов 'char *'. 'makeArr' возвращает один' char * ', а не массив из трех. И incidientally, '' abc \ n "' имеет длину четыре символа, пять с нулевым терминатором, поэтому вы не должны пытаться записать его в буфер размера 3. – hobbs
@hobbs Обновлен размер моего буфера, чтобы иметь более чем достаточно пространство. – freezefry
Вы забыли точку с запятой после 'sprintf (arr,"% s \ n "," abc ")'. – MikeCAT