相关疑难解决方法(0)

长度为零的结构的大小是多少?

我在下面测试一个程序:

#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)

c arrays gcc

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

struct中的初始化数组

我不明白为什么当我尝试以这种方式初始化结构时出现错误

typedef struct _floor
{
   int room;
   int height;
   int room_dim[room][2];
}Floor;
Run Code Online (Sandbox Code Playgroud)

为什么我不能用空间初始化room_dim数组?

c struct

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

bmiColors字段的BITMAPINFO结构

BITMAPINFO 结构有以下声明

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD bmiColors[1];
} BITMAPINFO;
Run Code Online (Sandbox Code Playgroud)

为什么RGBQUAD数组是静态的?为什么它不是指针?

c++ windows arrays struct

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

为什么在C和C++中结构初始化的这种不同行为?

代码:

#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 c++ gcc

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

什么是结构中的灵活数组成员?

我正在用 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 **arrayvoid *array[]我得到的

错误:灵活的数组成员不在结构的末尾

什么是灵活数组成员?

c flexible-array-member

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

char p [0]表示自动分配的缓冲区还是安全指针?

这是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]是非法的,但运行正常.

为什么会这样?

c c++

0
推荐指数
1
解决办法
126
查看次数

Rust - repr(C) 是预处理器指令吗?

我已经看到一些 Rust 代码库使用#[repr(C)](它叫什么?),但是,我找不到太多信息,但是它将内存中的类型布局设置为与“C”相同的布局。

这是我想知道的:这是一个仅限于编译器而不是语言本身的预处理器指令(即使 Rust 没有任何其他编译器前端),以及为什么 Rust 的内存布局与Cs的?(只是我从来没有用另一种语言来做这件事)。谢谢。

编辑:这是一个很好的情况来证明我的意思;如果有人为 Rust 创建了另一个编译器,他们是否需要实现这个宏,还是编译器特定的东西?

memory rust

0
推荐指数
1
解决办法
313
查看次数

我尝试使用 typedef 定义一个动态增长的数组,它最多可以工作 79 个索引,除此之外它不能,有人可以解决这个问题吗?

如果没有给出明确的大小,它会一直工作到索引 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)

c++ arrays typedef c++11

-1
推荐指数
1
解决办法
89
查看次数

取消引用这个指针给了我-46,但我不知道为什么

这是我运行的程序:

#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行为.

c pointers casting dereference

-3
推荐指数
2
解决办法
1243
查看次数

有什么神秘的事情发生?

我有一个与此代码相关的问题.

 #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个字符,程序崩溃.

为什么会这样?

c arrays

-6
推荐指数
1
解决办法
92
查看次数