我在下面测试一个程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct _node_t {
int id;
int contents[0];
}node_t;
int
main(int argc, char* argv[])
{
printf("sizeof node_t is: %d\n", sizeof (struct _node_t)); // output: 4
node_t *node = (node_t*)malloc(sizeof(node_t) + sizeof(int) * 3);
printf("sizeof node is: %d\n", sizeof (node)); // output: 8
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且节点瞬间的大小为8.但是,在malloc函数中,我将额外的3个整数添加到node结构中.为什么节点大小的输出仍然是8?
PS:gcc(GCC)4.6.3 20120306(Red Hat 4.6.3-2)
我不明白为什么当我尝试以这种方式初始化结构时出现错误
typedef struct _floor
{
int room;
int height;
int room_dim[room][2];
}Floor;
Run Code Online (Sandbox Code Playgroud)
为什么我不能用空间初始化room_dim数组?
BITMAPINFO 结构有以下声明
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
Run Code Online (Sandbox Code Playgroud)
为什么RGBQUAD数组是静态的?为什么它不是指针?
代码:
#include <stdio.h>
typedef struct{
int i;
int tab[];
}mystr;
mystr a = {1,{0,1,2}};
int main(void){
printf("%d%d%d\n",a.i,a.tab[0],a.tab[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C编译:
$ gcc main.c -o main && ./main
101
Run Code Online (Sandbox Code Playgroud)
C++编译:
$ g++ main.c -o main && ./main
main.c:8:27: error: too many initializers for ‘int [0]’
const mystr a = {1,{0,1,2}};
^
Run Code Online (Sandbox Code Playgroud)
我明白这个问题,就是tab没有分配任何内存.但为什么这对C来说没问题呢?为什么C++不会自动为内存空间分配tab?我知道结构类似于C++中的对象,但可能有一些我不了解全局对象实例化的细微之处?
我正在用 C 编写数组列表。
我针对通用标头定义了一个特定于实现的结构。
struct array_list_env {
void **array; // pointer to the array
size_t capacity; // length of the array
size_t size; // number of occupied elements in the array
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试将其更改void **array为void *array[]我得到的
错误:灵活的数组成员不在结构的末尾
什么是灵活数组成员?
这是C++代码,它显示编译器警告但运行正常.预期的行为如下,但是:
char sz[] = "Hello World";
char *p;
snprintf(p, 12, sz);
printf("%s", p);
Run Code Online (Sandbox Code Playgroud)
上面的代码运行时,因为没有分配*p而崩溃.好.
char sz[] = "Hello World";
char p[0];
snprintf(p, 12, sz);
printf("%s", p);
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,将显示"Hello World",没有任何错误.编译上面的代码显示编译器警告使用[0]是非法的,但运行正常.
为什么会这样?
我已经看到一些 Rust 代码库使用#[repr(C)]宏(它叫什么?),但是,我找不到太多信息,但是它将内存中的类型布局设置为与“C”相同的布局。
这是我想知道的:这是一个仅限于编译器而不是语言本身的预处理器指令(即使 Rust 没有任何其他编译器前端),以及为什么 Rust 的内存布局与Cs的?(只是我从来没有用另一种语言来做这件事)。谢谢。
编辑:这是一个很好的情况来证明我的意思;如果有人为 Rust 创建了另一个编译器,他们是否需要实现这个宏,还是编译器特定的东西?
如果没有给出明确的大小,它会一直工作到索引 79。它在索引 79 处打印值 200,但是当我将索引增加 1(即 80)时,它不会打印任何内容并且程序终止。
#include <iostream>
using namespace std;
typedef int list[];
int main() {
list myList{};
myList[79]={200};
cout<<myList[79]; // OUTPUT: 200
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
using namespace std;
typedef int list[];
int main() {
list myList{};
myList[80]={200};
cout<<myList[80]; // No Output and Process finished with exit code -1073741819 (0xC0000005)
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这是我运行的程序:
#include <stdio.h>
int main(void)
{
int y = 1234;
char *p = &y;
int *j = &y;
printf("%d %d\n", *p, *j);
}
Run Code Online (Sandbox Code Playgroud)
我对输出有点困惑.我所看到的是:
-46 1234
Run Code Online (Sandbox Code Playgroud)
我把这个程序写成了一个实验,不知道它会输出什么.我期待可能有一个字节y.
这里发生了什么"幕后"?解除引用如何p给我-46?
正如其他人指出的那样,我必须进行明确的施法才能导致UB.我没有改变这一行char *p = &y;,char *p = (char *)&y;所以我没有使下面的答案无效.
此程序不会导致此处指出的任何UB行为.
我有一个与此代码相关的问题.
#include <stdio.h>
void main()
{
char array[0];
scanf("%s", array);
printf("%s", array);
return;
}
Run Code Online (Sandbox Code Playgroud)
当我在输入字段中输入数据时,它会在数组中存储并获得输出,但它的大小为0.
另一件事情是,当我输入假设'a'12次然后以某种方式控制到达scanf()接受输入并再次进入'a'再次12次控制到达scanf()并继续直到我输入少于12个字符.
如果输入超过12个字符,程序崩溃.
为什么会这样?