Ответ 1
Похоже, вы путаетесь между указателями и массивами. Указатели и массивы (в данном случае char *
и char []
) не то же самое.
- В массиве
char a[SIZE]
указано, что значение в местеa
представляет собой массив длинойSIZE
- Указатель
char *a;
говорит, что значение в местоположенииa
является указателем наchar
. Это может быть объединено с арифметикой указателя, чтобы вести себя как массив (например,a[10]
- 10 записей, где бы ни былиa
).
В памяти это выглядит так (пример из FAQ):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
Легко смутить разницу между указателями и массивами, потому что во многих случаях ссылка на массив "распадается" на указатель на первый элемент. Это означает, что во многих случаях (например, когда передается вызов функции) массивы становятся указателями. Если вы хотите узнать больше, в этом разделе часто задаваемых вопросов см. Раздел "Частые вопросы" .
Одно важное практическое отличие заключается в том, что компилятор знает, как долго будет массив. Используя приведенные выше примеры:
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it a
// 32 or 64 bit machine)
Не видя своего кода, трудно рекомендовать лучший курс действий, но я подозреваю, что изменение использования указателей во всем мире решит проблемы, которые у вас есть. Обратите внимание, что теперь:
-
Вам нужно будет инициализировать память везде, где раньше были массивы. Например,
char a[10];
станетchar *a = malloc(10 * sizeof(char));
, а затем проверит, чтоa != NULL
. Обратите внимание, что в этом случае вам действительно не нужно говоритьsizeof(char)
, потому чтоsizeof(char)
определяется как 1. Я оставил его для полноты. -
В любом случае, когда вы ранее имели
sizeof(a)
для длины массива, нужно было бы заменить длину выделенной памяти (если вы используете строки, вы можете использоватьstrlen()
, который рассчитывает до'\0'
). -
Вам потребуется сделать соответствующий вызов
free()
для каждого вызоваmalloc()
. Это говорит компьютеру, что вы сделали, используя память, которую вы просили, с помощьюmalloc()
. Если ваш указательa
, просто напишитеfree(a);
в точке кода, где вы знаете, что вам больше не нужно, чтоa
указывает на.
Как уже указывалось в другом ответе, если вы хотите получить адрес начала массива, вы можете использовать:
char* p = &a[0]
Вы можете прочитать это как "char pointer p
становится адресом элемента [0]
of a
".