2016-11-03 64 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); 
} 

在这里,我声明了一个大小为0的字符数组'sss'。因此,它将无法将任何字符赋值给任何元素。但是,数组的行为就像一个动态分配的数组,允许分配任意数量的字符。上面的代码产生以下输出。C字符数组(C字符串)动态?

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不允许用零定义数组。

C11,6.7.6.2 Array declarators表示:

除了可选的类型限定符和关键字静态的,则[ 和]可限定表达式或*。如果它们分隔表达式 (其指定数组的大小),则表达式应该具有整数类型 。 如果表达式是一个常量表达式,则其应该具有大于零的值。

您所做的大部分工作(包括为该阵列分配值)为undefined behaviour

0

行为未定义,因为您尚未为数组项目分配内存。 试试这个: char sss[3]; 现在你可以分配给单个数组索引没有未定义的行为。