Как мне учесть, что NULL передается в качестве параметров в мою программу?

#c

#c

Вопрос:

Я пытаюсь объединить две строки. Я получаю ошибку сегментации, когда я передаю NULL в S1 и / или S2. Я полагал, что это как-то связано со строкой 19 при отладке, но я не могу понять это из-за моей неопытности.

 char *string_nconcat(char *s1, char *s2, unsigned int n)
{
        char *p1 = s1, *p2 = s2;
        unsigned int L1 = 0, L2 = 0, c = 0;
        char *cstr, *dest;
        if (s1 == NULL)
                s1 = "";
        if (s2 == NULL)
                s2 = "";
        while (*p1 != 0)
                p1  , L1  ;
        while (*p2 != 0)
                p2  ; L2  ;

        if (n >= L2)
                cstr = malloc((L1   L2   1) * sizeof(char));
        else
                cstr = malloc((L1   n   1) * sizeof(char));
        p1 = s1, p2 = s2, dest = cstr;
        if (cstr == NULL)
                return (NULL);

        while (*p1 != '')
        {
                *dest = *p1;
                dest  ;
                p1  ;
        }
        while (*p2 != '' amp;amp; c < n)
        {
                *dest = *p2;
                dest  ;
                p2  ;
                c  ;
        }
        *dest = '';

        return (cstr);
}
  

Комментарии:

1. можете ли вы скопировать копию без номера строк, из-за чего другим будет сложно помочь вам

2. Вы скопировали NULL в p1 или p2 , прежде чем проверять, является ли s1 или s2 NULL .

3. Когда s1 есть NULL , то while (*p1 != 0) также p1 есть NULL (потому что у вас есть char *p1 = s1 ), поэтому вы разыменовываете NULL указатель.

4. atSpinkoo удален, мои извинения. @user3386109 Это сработало! Так была бы причина ошибки сегментации в том, что я установил пустую строку после того, как пытался получить доступ к null?

5. C является императивным языком . Следовательно, он выполняет действия в указанном вами порядке. Присваивание p1 = s1 выполняется перед присваиванием s1 = "" . Следовательно, если s1 изначально равно NULL, то p1 будет NULL и s1 будет указывать на пустую строку. Когда вы проверяете условие *p1 != 0 , вы получите ошибку сегментации, потому что вы разыменовываете нулевой указатель.

Ответ №1:

Когда вы обнаруживаете, что вам передано значение NULL, вы устанавливаете s1 or s2 в пустую строку, но это не меняет того, на что указывают p1 / p2 , поэтому, когда вы пытаетесь использовать их позже, они по-прежнему указывают на NULL.

Ответ №2:

Добавить *p1 = s1, *p2 = s2; через ssecond while