Эта функция должна читать и расширять мой массив (stringa) до тех пор, пока пользователь не нажмет Enter, а затем также расширяет reverse до того же размера, что и stringa.
Но у меня две основные проблемы:
printf("%d\n", sizeof(*stringa) / sizeof(*stringa[0])), чтобы проверить, меняется ли размер stringa, но, видимо, это не так (он печатает только 8)void inputStringaAndCreateReverse(char* *stringa, char* *reverse, int* iStringa) {
int inputChar, i = 0, size = 1;
bool notEnter = true;
printf("Insert the string: ");
while (notEnter) {
if ((inputChar = getche()) != '\r') {
*stringa[i++] = inputChar;
*stringa = realloc(*stringa, (++size) * sizeof(char));
printf("%d\n", sizeof(*stringa) / sizeof(*stringa[0]));
} else if (size != 1) {
notEnter = false;
system("CLS");
} else {
printf("\n");
}
}
*stringa[i] = '\0';
*iStringa = strlen(*stringa) - 1;
reverse = realloc(reverse, (*iStringa + 1) * sizeof(char));
}
Вот результаты теста (хотела написать привет)h8
e8
l8
l
Как я уже сказал, 8 — это число, которое он печатает каждый раз, когда предполагается расширить массив.
стринга и реверс выделены в основном asstringa = (char*) malloc(sizeof(char))
@Stefano Carletto, "%d" - неправильный спецификатор для печати типа size_t. Используйте printf("%zu\n", sizeof(*stringa) / sizeof(*stringa[0]));. Это не решит проблему «8 - это число, которое он печатает каждый раз», но решает другие.





Кажется, вы ожидаете, что printf("%d\n", sizeof(*stringa) / sizeof(*stringa[0])); напечатает количество символов, (пере)выделенных для *stringa.
Если да, то ответ таков: ваши ожидания неверны.
Сделаем шаг назад.
Для массивов верно, что код вроде
sizeof(array) / sizeof(array[0])
даст количество элементов массива.
Например:
int array[] = {1, 10, 100, 1000};
size_t elements = sizeof(array) / sizeof(array[0]);
присвоит elements значение 4.
Но это не то, что вы делаете.
Ваш stringa не является массивом. Ваша переменная stringa имеет указатель типа на указатель на символ.
Следовательно, *stringa имеет указатель типа на char.
Так что sizeof(*stringa) это то же самое, что sizeof(char*)
stringa[0] также является указателем на char и, следовательно, *stringa[0] является char. Это означает, что sizeof(*stringa[0]) совпадает с sizeof(char).
Теперь мы можем переписать
sizeof(*stringa) / sizeof(*stringa[0])
быть
sizeof(char*) / sizeof(char)
Поскольку sizeof(char) всегда равно 1, мы можем даже записать его как просто
sizeof(char*)
Размер указателя является фиксированным числом. Он не меняется в зависимости от объема памяти, на который указывает. В большинстве 64-битных систем (если не во всех) размер указателя равен 8. Вот почему ваш оператор печати всегда показывает 8.
КСТАТИ:
*stringa[i++] не делает того, что вы ожидаете. Проверить приоритет оператора.
reverse = ... наверное должно быть *reverse = ...
ОТ:
Код начинается с size = 1. Вы не показали нам, как вы вызываете функцию, так что это может быть правильно/преднамеренно, но это кажется довольно странным. Вы действительно ожидаете, что вызывающая сторона предоставит указатель на указатель на char, который уже указывает ровно на один динамически выделенный char? Для меня это очень странный API функций.
sizeof(*stringa) / sizeof(*stringa[0])— это размер указателя или 8 в вашей системе, разделенный на размер символа, который всегда равен 1. Таким образом вы не можете определить размер выделенного блока памяти, только размер массива в область, в которой она объявлена. Если вы используетеmalloc/calloc/realloc, вам нужно следить за размером самостоятельно, если вам это нужно.