поведение строки в C - PullRequest
       3

поведение строки в C

5 голосов
/ 29 декабря 2011

Я читаю курс C (он голландский, поэтому, вероятно, вы не будете знать), и есть небольшое упражнение, чтобы понять поведение строки.Поэтому я создал небольшую C-программу, чтобы начать упражнение, но уже первый результат моей программы (для меня) удивителен.

Источник моей C-программы:

#include <string.h>
#include <stdio.h>

void printString(char *string)
{
    printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n");
    printf("%c ",string[0]);
    printf("%c ",string[1]);
    printf("%c ",string[2]);
    printf("%c ",string[3]);
    printf("%c ",string[4]);
    printf("%c ",string[5]);
    printf("%c ",string[6]);
    printf("%c ",string[7]);
    printf("%c ",string[8]);
    printf("%c ",string[9]);
    printf("%c  ",string[10]);
    printf("%c  ",string[11]);
    printf("%c  ",string[12]);
    printf("%c  ",string[13]);
    printf("%c  ",string[14]);
    printf("%c  ",string[15]);
    printf("%c  ",string[16]);
    printf("%d  ",string[17]);
    printf("%d  ",string[18]);
    printf("%d\n",string[19]);
}

void main(){

    char str[20];

    strcpy(str,"Dag grootmoeder!");
    printString(str);
}

, скомпилированный с помощьюgcc (без специальных переключателей) и запускал программу несколько раз: (для англоговорящих людей Dag grootmoeder! == Hi grandma!)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    94  -90  111

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    51  -12  96

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    -17  -117  28

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    96  15  -28

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    -20  -46  -18

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    68  -75  58

Вот вопрос:

1) Почему я получаю мусорзначения за последние 3 индекса str?Сначала я также printf() использовал их с %c и заметил, что символы изменились, поэтому после этого я использовал %d для отображения целочисленных значений.

2) Почему эти значения меняются?Я ничего больше не делаю, кроме того, что копирую ту же строку, используя strcpy() на стр.

Спасибо за то, что нашли время прочитать, и даже больше за тех, кто отвечает!

Йорн

Ответы [ 3 ]

8 голосов
/ 29 декабря 2011

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

В C "строки" на самом деле являются 0 -определенными массивами (или указателями на память). Поэтому, если вы печатаете символы, используя "%d", вы заметите, что самый последний элемент, сразу после !, будет 0.

Если вы хотите, чтобы она была предсказуемой, вы можете инициализировать вашу строку перед ее использованием:

memset(str, 0, sizeof(str));

или

char str[20] = {0,};

Как примечание, это int main, а не void main.

0 голосов
/ 29 декабря 2011

Объекты, определенные в области блока без какого-либо спецификатора класса хранения (например, ваш str объект массива), имеют автоматическую продолжительность хранения.

Автоматические объекты, которые не были явно инициализированы, имеют неопределенное значение. Таким образом, после объявления объекта str все элементы массива имеют неопределенное значение. Скопировав строку "Dag grootmoeder!" в массив, вы получите первые 17 (длина строки + завершающий нулевой символ) элемент с указанным значением. Это оставляет последние 3 элемента вашего массива с неопределенным значением.

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

0 голосов
/ 29 декабря 2011
char str[20];
...
strcpy(str,"Dag grootmoeder!");

str начинается со случайных значений (что было в прошлый раз, когда использовалась RAM) Теперь вы копируете в нее 16-байтовую строку, оставляя последние 3 символа там начальными (случайными) значениями, поэтому они распечатываются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...