2016-11-03 4 views
0
#include <stdio.h> 
#include <string.h> 
void main(){ 
    char sss[0]; //array with 0 elements 
    sss[0]= 'h'; sss[1]= 'o'; sss[2]= 'w'; //how does this line compile wihtout error? 
    printf("sss after 3 chars added: %s\n", sss); 
    strcpy(sss, "n"); 
    printf("sss after strcpy: %s\n", sss); 
    strcat(sss, " stuff"); 
    printf("sss after strcat: %s\n", sss); 
} 

Здесь я объявил массив символов sss 'с размером 0. Таким образом, он не сможет назначить какой-либо символ каким-либо элементам. Однако массив ведет себя как динамически распределенный, позволяя присвоить любое количество символов. Вышеприведенный код дает следующий результат.C char array (C string) dynamic?

sss after 3 chars added: how 
sss after strcpy: n 
sss after strcat: n stuff 

Я думал, что C был строгим с распределением массивов и ожидал, что он выбросит ошибку «размер массива вне диапазона». Почему/как это происходит?

+2

см. Это: http://stackoverflow.com/questions/15646973/how-dangerous-is-it-to-access-an-array-out-of-bounds –

+0

'' размер массива вне диапазона "ошибка" Откуда у вас появилась идея, что это даже вещь в C? – John3136

+1

sss - всего лишь указатель. и sss [X] эквивалентно * (sss + X) –

ответ

0

C не позволяет определить массив с нулем.

С11, 6.7.6.2 Array declarators говорит:

В дополнении к дополнительным классификаторам типа и ключевому слову статических, то [ и] может разграничить выражение или *. Если они ограничивают выражение (которое определяет размер массива), выражение должно иметь целочисленный тип . Если выражение является константным выражением, оно должно иметь значение , значение которого больше нуля.

Большая часть того, что вы делаете, включая присвоение значений этому массиву, составляет undefined behaviour.

0

Поведение не определено, поскольку вы не выделили память для элементов массива. Попробуйте следующее: char sss[3]; Теперь вы можете назначить отдельные индексы массивов без неопределенного поведения.