1 Востаннє редагувалося Ярослав (13.01.2013 18:58:53)

Тема: Покажчик на масив

#include <stdio.h>

int strcat(char *, char *);

int main(int argc, char *argv[])
{
    char arr1[]="abc";
    char arr2[]="11d11def11def";
    if(strcat(arr1, arr2))
        printf("Sucsess: %s\n", arr1);
    else
        printf("There is nothing to add\n");
    return 0;
}

int strcat(char *s, char *t){
    while(*s != '\0'){
        s++;
    }
    if(*t){
        while(*s = *t){
            s++;
            t++;
        }
        return 1;
    }else
        return 0;
}

Чому наступний цикл спричиняє таку помилку "*** Process returned -1073741819 ***"

while(*s = *t){
            s++;
            t++;
        }

Або подібний йому, приведений в книзі K&R

        
while(*s++ = *t++){
       /*s++;
       t++;*/
}

2

Re: Покажчик на масив

 while(*s != '\0'){
        s++;
    }

для чого ви це зробили?

3 Востаннє редагувалося Patron (13.01.2013 22:03:46)

Re: Покажчик на масив

 
int main(int argc, char *argv[])
{
    char arr1[20]="abc"; // я вказав виділити пам'ять під 20 char і все пройшло успішно

Думаю проблема в тому що коли ви копіювали в arr1, ви через вказівник s вилізли за межі масиву який був автоматично створений меншим ніж на потрібну вам кількість символів, і це призвело до його крашу. Але хз, я точно не можу сказати, немаю достанього досвіду в С++. І взагалі алгоритм копіювання неправильний і ніколи його не використовуйте на практиці. Спочатку треба виділити достатньо пам'яті вже потім туди щось заносити а ви використали дуже небезпечний алгоритм.

4 Востаннє редагувалося Ярослав (13.01.2013 23:23:11)

Re: Покажчик на масив

Patron написав:
 while(*s != '\0'){
        s++;
    }

для чого ви це зробили?

Для того щоб покажчик вказував на останній символ масиву, для того щоб потім дописати символи із іншого масиву в його кінець. Це вправа із К&Р.

5

Re: Покажчик на масив

Patron вірно вказав стосовно виходу за межі масиву.

Стандартні функції strcat(), strcpy() і ще ланцюжок їм подібних належать до небезпечних і їх варто уникати або використовувати з обережністю, оскільки вони не перевіряють (як і видно з циклу), чи достатньо взагалі місця для копіювання даних.
Як альтернатива на практиці - функція memcpy() з malloc.h.

Між іншим, достатньо корисна вправа. Якщо знайдете, як розв'язати проблему виходу за межі масиву - добре. Якщо знайдете найменш затратний метод - взагалі прекрасно:).

З.І: якщо у процесі зневаджування або взагалі Runtime-помилок ви бачите величезне від'ємне число - перевірте усі необхідні у задачі ініціалізації змінних. А тоді і розмірності масивів про всяк.