#include <stdio.h>
#include <string.h>
int main()
{
char a[]={};
scanf("%s",a);
printf("%lu",strlen(a));
return 0;
}
这样编译运行,居然毫无问题
c99允许长度为零的数组。当然目的不是为了你这样用,而是为了实现柔性数组成员。
比如:\
char a ="abc";
int this_length = strlen(a);
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
之前标准contents必须给至少1个字节,这样会浪费空间,且给malloc的函数参数计算不够简洁。
以前看redis代码,我记得很多地方都这样用。
你这样用,对没有分配的内存进行操作,属于内存非法操作,不过c不管这些的,随你搞。因为小代码,这个操作没有惹到别的进程,以及系统,所有没有爆。就像内存泄露,虽然是错误的做法,倒也不至于立刻引发问题。