разница между символьный массив инициализировать строковым литералом и с помощью и strcpy


Пожалуйста, помогите мне понять, в чем разница, используя инициализированный массив символов, такой как char line[80]="1:2" (который не работает !! ) и используя char line[80], а затем strcpy(line,"1:2").
В соответствии с моим пониманием в первом случае у меня есть массив charachter, ему была выделена память, и я копирую в него строковый литерал. И то же самое делается во втором случае. Но, очевидно, я ошибаюсь. Так что же не так с моим пониманием.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void tokenize(char* line)
{
   char* cmd = strtok(line,":");

    while (cmd != NULL)
    {
    printf ("%sn",cmd);
    cmd = strtok(NULL, ":");
    } 
}

int main(){
char line[80]; //char line[80]="1:2" won't work 
/*
char *line;
line = malloc(80*sizeof(char));
strcpy(line,"1:2");
*/
strcpy(line,"1:2");
tokenize(line);
return 0;
}
1 2

1 ответ:

Вы ошибаетесь. Результат этих двух фрагментов кода

char line[80] = "1:2";

И

char line[80];
strcpy( line, "1:2" );

То же самое. Вот это утверждение

char line[80] = "1:2";

Действительно работает.:) Есть только одно различие. При инициализации массива строковым литералом все элементы массива, которые не будут иметь соответствующего символа инициализации строкового литерала, будут инициализированы '\0' , то есть они будут инициализированы нулем. В то время как при использовании функции strcpy элементы массива те, которые не были перезаписаны символами строкового литерала, будут иметь неопределенные значения.

Массив инициализируется строковым литералом (за исключением нулевой инициализации его "хвоста") так же, как если бы была применена функция strcpy.

Между этими утверждениями существует точная эквивалентность результата

char line[80] = "1:2";

И

char line[80];
strncpy( line, "1:2", sizeof( line ) );

Это когда вы используете функцию strncpy и задаете размер целевого массива.

Если вы имеете в виду, что вы прошли в функции tokenize непосредственно строковый литерал в качестве аргумента функции, то программа имеет неопределенное поведение, потому что вы не можете изменить строковые литералы.

В соответствии со стандартом C (6.4.5 строковые литералы)

7 не определено, различны ли эти массивы при условии, что их элементы имеют соответствующие значения. Если программа попытается модифицируйте такой массив, поведение которого не определено.