argc, argv вызывает странное поведение в нулевом терминаторе в C - PullRequest
0 голосов
/ 05 ноября 2018

когда я пишу:

#include <cs50.h> // includes type string
#include <stdio.h>

void trial(string a[])
{
    if(a[2] == '\0')
    {
        printf("Null\n");
    }
}

int main(int argc, string argv[])
{
    string a[] = {"1","2"};
    trial(a);
}

Похоже, что массив строк не заканчивается нулевым символом.

Но когда я пишу int main (void), выводится «Null».

Еще более странно, когда я добавляю return 0; для int main (void) не выводится «Null».

Я не понимаю, что происходит, в коде лекции CS50, который работает ниже:

#include <stdio.h>
#include <cs50.h>

int len(string s)
{
    int count=0;

    while(s[count] != '\0')
    {
        count++;
    }
   return count;
}


int main(int argc, string argv[])
{
    string s = get_string("Input: \n");

    printf("Length of the string: %d \n",len(s));

    return 0;
}

Мне известно о разнице между нашими массивами, моя - это массив строк, код выше - строка, которая является массивом символов. Но в некоторых постах я видел, что массивы символов не заканчиваются нулем. Но, возможно, в cs50.h они реализовали строку как массив символов, который заканчивается нулевым символом. Я потерян.

1 Ответ

0 голосов
/ 05 ноября 2018

string a[] = {"1","2"} - массив из 2 элементов. К нему не будет добавлен скрытый NULL-указатель. Доступ к a[2] (его потенциальный 3-й элемент) делает вашу программу неопределенной. Нет особого смысла анализировать, как различные переменные влияют на программу, поведение которой не определено. Это может варьироваться от компилятора к компилятору.

#include <stdio.h>
int main(void)
{
    //arrays of char initialized with a string literal end with '\0' because
    //the string literal does
    char const s0[] = "12";
#define NELEMS(Array) (sizeof(Array)/sizeof(*(Array)))
    printf("%zd\n", NELEMS(s0)); //prints 3

    //explicitly initialized char arrays don't silently append anything
    char const s1[] = {'1','2'};
    printf("%zd\n", NELEMS(s1)); //prints 2


    //and neither do array initializations for any other type
    char const* a[] = {"1","2"};
    printf("%zd\n", NELEMS(a)); //prints 2
}
...