相关疑难解决方法(0)

"struct hack"在技术上是不确定的行为吗?

我要问的是众所周知的"结构的最后一个成员有可变长度"的技巧.它是这样的:

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的方法,我希望答案专门针对上面列出的技巧版本.

c c89 undefined-behavior

109
推荐指数
7
解决办法
9414
查看次数

可能整个数组驻留在一些cpu寄存器中?

因为我不太熟悉cpu寄存器,一般而言,在任何体系结构中都特别使用x86,如果使用VC++编译器相关,我很好奇,数组的所有元素都可能像数组一样具有少量元素1个字节的字符有4个元素驻留在某个cpu寄存器中,因为我知道对于像double,integer等单个基元来说这可能是真的吗?

当我们有如下参数时:

void someFunc(char charArray[4]){
//whatever
}
Run Code Online (Sandbox Code Playgroud)

这个参数传递肯定会通过传递指向函数的指针来完成,或者该数组是否会驻留在某个cpu寄存器中,从而无需将指针传递给主存储器?

c++ arrays parameters cpu

3
推荐指数
1
解决办法
1430
查看次数

函数调用中char []和char*之间的区别

我发现自己无法解释为什么以下代码有效.不用说,我对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]之间差异的答案证实了我的观察,但它没有详细说明为什么会出现这种情况.

谢谢!

c c++ char

1
推荐指数
2
解决办法
2616
查看次数

标签 统计

c ×2

c++ ×2

arrays ×1

c89 ×1

char ×1

cpu ×1

parameters ×1

undefined-behavior ×1