Некоторые «предсказывают результаты» с помощью указателей - PullRequest
0 голосов
/ 16 февраля 2010

Помогите мне в решении 2 вопросов по указателям:

1) Скажите, почему я получаю «ошибку сегментации» при выполнении следующего фрагмента

main()  
{   
    char *str1 = "united";  
    char *str2 ="front";  
    char *str3;  
    str3 = strcat(str1,str2);  
    printf("\n%s",str3);  
}

2) Почему я не получаю вывод в следующем коде:

main()  
{  
    char str[10] = {0,0,0,0,0,0,0,0,0,0};  
    char *s; 
    int i;   
    s = str;  
    for(i=0 ; i<=9;i++)  
    {  
        if(*s)  
            printf("%c",*s);
        s++; 
    }   
}

Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2010
  1. Вы должны рассмотреть, как работает strcat . Он попытается перезаписать память в конце указателя str1, а затем вернет указатель назначения обратно к вам. Компилятор только выделил достаточно памяти в str1 для хранения «United \ 0» (7 символов), который вы пытаетесь заполнить «Unitedfront \ 0» (12 символов) str1 указывает только на 7 выделенных символов, поэтому место для конкатенации отсутствует.

  2. *s будет разыменовываться s, фактически давая вам первый символ в массиве. Это 0, что будет иметь значение false.

2 голосов
/ 16 февраля 2010

1) компилируется во что-то вроде:

const char _str1[7] = "united";
const char _str2[6] ="front";
char *str1 = _str1;
char *str2 = _str2;
strcat(str1,str2);
str3 = str1;

str1 указывает на буфер, длина которого ровно 7 байтов и заполнена 6 символами. Strcat поместил еще 5 байтов в этот буфер. 7 байтов не могут содержать 11 символов. С магией нет! Если вы явно не выделяете место для чего-либо, никто другой тоже не делает этого ...

2) не собирается ничего печатать. Он проходит через массив, каждый элемент которого равен 0. Затем он проверяет, является ли текущий элемент (*s) не 0 (if(*s)), и, если это так, печатает этот элемент как символ. Однако, поскольку элемент всегда равен 0, он всегда не проходит проверку.

1 голос
/ 16 февраля 2010

для вопроса 2, подумайте о том, что делает следующая строка:

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