我要问的是众所周知的"结构的最后一个成员有可变长度"的技巧.它是这样的:
struct T {
int len;
char s[1];
};
struct T *p = malloc(sizeof(struct T) + 100);
p->len = 100;
strcpy(p->s, "hello world");
Run Code Online (Sandbox Code Playgroud)
由于结构在内存中的布局方式,我们可以将结构覆盖在一个大于必要的块上,并将最后一个成员视为大于1 char指定的大小.
所以问题是:这种技术在技术上是不确定的行为吗?.我希望它是,但很好奇标准对此有何看法.
PS:我知道C99的方法,我希望答案专门针对上面列出的技巧版本.
因为我不太熟悉cpu寄存器,一般而言,在任何体系结构中都特别使用x86,如果使用VC++编译器相关,我很好奇,数组的所有元素都可能像数组一样具有少量元素1个字节的字符有4个元素驻留在某个cpu寄存器中,因为我知道对于像double,integer等单个基元来说这可能是真的吗?
当我们有如下参数时:
void someFunc(char charArray[4]){
//whatever
}
Run Code Online (Sandbox Code Playgroud)
这个参数传递肯定会通过传递指向函数的指针来完成,或者该数组是否会驻留在某个cpu寄存器中,从而无需将指针传递给主存储器?
我发现自己无法解释为什么以下代码有效.不用说,我对C++很陌生......
#include <cstdio>
void foo(char* p)
{
p[0] = 'y';
}
int main()
{
char a[1];
a[0] = 'x';
printf("a[0] = %c\n", a[0]);
foo(a);
printf("a[0] = %c\n", a[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该计划输出
a[0] = x
a[0] = y
Run Code Online (Sandbox Code Playgroud)
是什么让我感兴趣的是我没有将指针传递给foo.那么如何才能改变数组的值?这只适用于char数组吗?
char和char [1]之间差异的答案证实了我的观察,但它没有详细说明为什么会出现这种情况.
谢谢!