URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2779
[ Назад ]

Исходное сообщение
"Проблема с char массивами"

Отправлено Atos , 09-Апр-04 13:58 
Есть исходник:

include <string.h>
...cut...
int main()
{
  char To[2]="To";
  char Tow[2]="To";
  char *Ukaz, *Ukaz2;
  
  Ukaz=To; Ukaz2=Tow;

//Цикл проверки значений Ukaz и Ukaz2

for(p=0;p<=i;p++)
{
        if(Ukaz[p]==Ukaz2[p])
        printf("%d\n",p);
        else
        {
        printf("ne ravno");
        break;
        }
}
return 0;
}

При выполнении доходит до 2-го знака(тоесть до '\0') И выкидывает через break. :-(
Попытался узнать, где-же находится '\0'. И ввел в исходник:

i=0;
while(Ukaz[i]) i++;
printf("%d\n",i); //Дабы узнать где находится '\0'

При выполнии i = 20.
Откуда такое значение, если иницилизация переменной char To[2]="To"; ?


Содержание

Сообщения в этом обсуждении
"Проблема с char массивами"
Отправлено Simps , 09-Апр-04 14:32 
>Есть исходник:
>
>include <string.h>
>...cut...
>int main()
>{
>  char To[2]="To";
>  char Tow[2]="To";
>  char *Ukaz, *Ukaz2;
>
>  Ukaz=To; Ukaz2=Tow;
>
>//Цикл проверки значений Ukaz и Ukaz2
>
>for(p=0;p<=i;p++)
>{
>        if(Ukaz
>
>==Ukaz2
>
>)
>        printf("%d\n",p);
>        else
>        {
>        printf("ne ravno");
>        break;
>        }
>}
>return 0;
>}
>
>При выполнении доходит до 2-го знака(тоесть до '\0') И выкидывает через break.
>:-(
>Попытался узнать, где-же находится '\0'. И ввел в исходник:
>
>i=0;
>while(Ukaz[i]) i++;
>printf("%d\n",i); //Дабы узнать где находится '\0'
>
>При выполнии i = 20.
>Откуда такое значение, если иницилизация переменной char To[2]="To"; ?
А где ты присваиваешь значение i ? Насколько я помню С не занимается обнулением обьявленных переменных ?

"Проблема с char массивами"
Отправлено art_corp , 09-Апр-04 16:12 
Проблема в том(скорее всего), что ты пишешь:
char[2] x = "To";,а "To\0" - занимает 3 символа ('T''o''\0')
так ты затираешь какие-то данные в памяти (хотя я и могу ошибаться)  
попробуй написать char[3] x = "To";

"Проблема с char массивами"
Отправлено newser , 09-Апр-04 16:14 
>Попытался узнать, где-же находится '\0'. И ввел в исходник:
>
>i=0;
>while(Ukaz[i]) i++;
>printf("%d\n",i); //Дабы узнать где находится '\0'
>
>При выполнии i = 20.
>Откуда такое значение, если иницилизация переменной char To[2]="To"; ?

Конструкция char To[2] сколько памяти резервирует? Правильно, две! А строка "To" сколько памяти занимает с учетом нулевого символа ('\0')? Три! Вот и получается, что i = 20! Пример более правильного объявления:
char To[3] = "To";
либо
char To[] = "To";
либо
char *To = "To";


"Проблема с char массивами"
Отправлено Atos , 09-Апр-04 16:52 
Проблема решилась заменой:
char To[2]="To";
на
char *To="To";
А на счет трьох символов, то если посмотреть To[0], то выдаст "Т".
Тоесть нумерация идет не с 1, а с нуля...
Всем спасибо за помощь в сей проблеме....

"Проблема с char массивами"
Отправлено mike , 11-Апр-04 12:19 
>Тоесть нумерация идет не с 1, а с нуля...
>Всем спасибо за помощь в сей проблеме....

Newser все правильно сказал

char To[2] - это массив из двух байт. To[0] - это первый, To[1] - это второй, а вот To[2] - это невыделенный участок памяти.

А для строки из двух символов необходимо выделять три байта, так как завершающий 0 нужно тоже где-то хранить.

По этому, часто можно встретить такие участки кода:

char *newstr=(char*)malloc(strlen(str)+1);