小编Spa*_*Guy的帖子

我们必须malloc一个结构吗?

请考虑以下代码:

struct Node {
    void* data;
    int ref;
    struct Node* next;
};
typedef struct Node* NodePtr;
Run Code Online (Sandbox Code Playgroud)

我发现每当我尝试使用NodePtr的字段做任何事情时,我都会遇到段错误.例如:

NodePtr node;
node->ref = 1;
Run Code Online (Sandbox Code Playgroud)

所以我为NodePtr分配了一些空间,现在它似乎工作正常.为什么是这样?我的猜测是,由于节点只是一个指针,它的字段没有内存.

所以我尝试初始化NodePtr:

NodePtr node = {
    node->data = 0;
    node->next = NULL;
    node->ref = 0;
};
Run Code Online (Sandbox Code Playgroud)

好吧,我收到了这个错误:

error: expected â}â before â;â token
Run Code Online (Sandbox Code Playgroud)

这归结为四个问题:

  1. 如果我的猜测不正确,如果我不使用malloc(),为什么它不起作用?
  2. 为什么我的初始化不起作用?
  3. 初始化一个struct会在堆栈上提供内存并解决我的问题吗?
  4. 如果没有,我是否可以为我使用的每个结构分配内存?

c malloc struct

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

C和dlc编译器发生奇怪的解析错误

我有以下代码:

int bitSwitcher = (1 << n) + ~0;
bitSwitcher = bitSwitcher << (32 + (~n + 1));
int arthShift = x >> n;
int logShift = arthShift ^ bitSwitcher;

int xSign = x >> 31;
int wasNegShift = xSign & logShift;
int wasPosShift = arthShift;

return wasNegShift ^ wasPosShift;
Run Code Online (Sandbox Code Playgroud)

解析错误的行是: int arthShift = x >> n;

编译器还说,在最后一行: return wasNegShift ^ wasPosShift; wasNegShift和wasPosShift是未声明的,我假设因为他们的声明直接使用arthShift或使用其声明依赖于arthShift的其他变量.

我正在使用一种称为DLC编译器的东西作为编程拼图分配的一部分.它旨在确保您遵循特殊规则(例如:您可能只使用某些值和运算符).偶尔我会得到这些奇怪的"解析错误"(这是它给出的唯一信息;"解析错误"以及数字行.我不怀疑错误与特殊规则有关,因为当你违反它们时,它非常明确.

我试过重新输入代码.我已经从在线C编辑器/编译器(它没有捕获到这个错误)中复制和粘贴,并且,为了防止一些奇怪的字符可能已经悄悄进入,我重新键入了整个函数.我之前有过随机字符蠕变,就像Django无法读取的复制粘贴引号,同时使用我现在使用的相同文本编辑器(Sublime).检查这种可能性并没有帮助.

2.我使用的在线编译器不仅不会引发任何解析错误,GCC也不会.

3.我正在和这个人做同样的练习:在C中解析错误 他/她也得到了同样的错误,似乎没有人能够弄明白.

如果有一个神奇的灵魂可能有任何想法或可能的解决方案...... :)也许掌握编译器知识的人可能会知道这样的问题可能出现的模糊情况.我现在受这个编译器的支配.

PS:如果你碰巧弄明白这个功能的目的,我已经知道至少有一个案例它不起作用.哈哈,我只是想弄清楚这个错误.

c compiler-errors

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

确定一个数字是否可以表示为 n 位整数(二进制补码)

关于二进制补码,我有点难以理解如何在 C 中使用位。

这是家庭作业的一部分,但我不是在寻找代码答案,而是要了解二进制补码表示发生了什么。

我的任务是将一个数字限制为特定的位数 (n),并确定给定的数字是否可以用 n 位数的二进制补码表示。

根据示例,5 不能表示为 3 位整数,而 -4 可以表示为 3 位整数。

为什么是这样?


编辑:我详细解释了我的思考过程,但意识到我完全偏离了所以决定省略它。

我最初的推理是看看允许 5 和 -5、4 和 -4 以 3 位表示是否有意义。但这没有意义,因为这并没有真正解决问题。

我理解 5 和 -4 如何表示为二进制补码。例如,作为 4 位:

5:0101

-4:1100


第二次编辑:

为了澄清起见,决定添加我原来的推理:

5 是 0101,-5 是 1011。
我可以看到当限制为 3 位时,5 不能用二进制补码表示,因为没有第 4 位,我们就不能表示 -5 是负数。我们需要 1011 中的额外 1。如果我们最多只能有 3 位,我们将有 011,并且无法区分 -5 和 3,后者是 4 位中的 0011,以及 011在 3 位。这个推理正确吗?

4 是 0100,-4 是 1100。
这里我很困惑。我不明白为什么 -4 可以用 3 位表示为二进制补码整数。

4 表示为 0100,100 表示为 …

c bit-manipulation

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

标签 统计

c ×3

bit-manipulation ×1

compiler-errors ×1

malloc ×1

struct ×1