小编chq*_*lie的帖子

当struct中的指针指向struct本身时,C如何解析循环定义?

我习惯于像下面那样长时间编码.

但是C编译器如何解决循环定义问题?或者这个问题真的存在吗?

struct node {
    int data;
    struct node *next; // circular definition for "struct node" type?
};
Run Code Online (Sandbox Code Playgroud)

添加1

或者,在32位机器上,我可以将struct node * next成员视为32位无符号整数类型的成员吗?这让我感觉好多了.

添加2

我想循环定义的原因是,当编译器遇到类似next -> data或者next -> next,它必须知道确切的偏移每个成员添加到next指针以获得每个成员的正确位置.而这种计算需要了解每个成员的类型.因此,对于该成员next,可能会出现循环定义问题:

类型nextstruct node *,struct node类型包含a next,类型nextstruct node *...

添加3

编译器如何计算sizeof(struct node)

添加4

好吧,我认为理解这个看似圆形的问题的关键概念是,指针的大小与它指向的类型无关.并且尺寸固定在特定的机器上.指针的类型在编译时有意义,以便编译器生成指针计算指令.

c

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

为什么 libxml2 在 C/C++ 代码中到处都使用“BAD_CAST”?

据说是因为libxml2unsigned char用作存储,方便字符集之间的编码/解码----在读取/创建xml节点名称,内容,文本时,强制用户在代码中到处写“BAD_CAST”是不是很丑陋节点等

有没有办法避免到处写这样的“BAD_CAST”?设计真的太差了。

c linux casting libxml2

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

指示在c中评估操作数的顺序

声明puts("a") + puts("b")未定义.这是因为C标准中没有规定这些是否应该从左到右或从右到左执行,这样你才能得到

a
b
Run Code Online (Sandbox Code Playgroud)

要么

b
a
Run Code Online (Sandbox Code Playgroud)

是否有一种干净的方式来决定表达式中的操作顺序?

我唯一能想到的是使用复合语句,如

({
    int temp = puts("a");
    temp += puts("b");
    temp;
})
Run Code Online (Sandbox Code Playgroud)

虽然这是不便携的,比我希望的要长一点.

如何最好地实现这一目标?

c operator-precedence

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

C - 读取整个文件最后带有垃圾

所以我试图使用这个函数读取整个文本文件:

FILE *fp = fopen(path, "r");
fseek(fp, 0, SEEK_END);
int tamanioArchivo = sizeof(char) * ftell(fp);
fseek(fp, 0, SEEK_SET);
char* archivo = malloc(tamanioArchivo + 1);
fread(archivo, tamanioArchivo + 1, 1, fp);
//do something with archivo
fclose(fp);
free(archivo);
Run Code Online (Sandbox Code Playgroud)

我调试了它,问题似乎就fread行了。它带回文件并在最后添加一些垃圾。任何想法我做错了什么?

c file

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

C编程更喜欢uint8而不是char

我处理的代码有很多正在制成铸件uint8char,然后将C库函数呼吁这个castings.I试图理解为什么会作家喜欢uint8char.例如:

uint8 *my_string = "XYZ";
strlen((char*)my_string);
Run Code Online (Sandbox Code Playgroud)

发生什么事\0,是否在我演员时添加?

当我转过身来时会发生什么?

这是一个工作的合法的方式,为什么会有人喜欢用合作uint8char

c

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

如何使2D字符数组完全为空?

我正在使用malloc创建一个2D数组,当我遍历该数组时,有一些我不想要的字符和符号。数组不应该完全为空吗?

我试图将空字符分配给每一行的开头,但这不会改变任何内容。

    char **structure;
    structure = malloc(sizeof *structure * 2);
    if (structure) {
        for (size_t i = 0; i < 2; i++) {
            structure[i] = malloc(sizeof *structure[i] * 20);
            structure[i][0] = '\0';
        }
    }
    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j < 20; j++) {
            printf("%c ", structure[i][j]);
        }
        printf("\n");
    }

Run Code Online (Sandbox Code Playgroud)

我期望输出只是空白,但这是出现的情况:

Z Ñ             P  Ñ             l   L O
Z Ñ               P  Ñ             N U M B
Run Code Online (Sandbox Code Playgroud)

c

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

使用 &gt;&gt; 运算符重载时出错

错误如下(倒数第二行):

Error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Complex()')|
Run Code Online (Sandbox Code Playgroud)

这是代码:

#include <iostream>

using namespace std;

class Complex {
  private:
    int a, b;
  public:
    Complex(int x, int y) {
        a = x;
        b = y;
    }
    Complex() {
        a = 0;
        b = 0;
    }
    friend ostream& operator << (ostream &dout, Complex &a);
    friend istream& operator >> (istream &din, Complex &a);
};

ostream& operator << (ostream &dout, Complex &a) {
    dout << a.a << " + …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

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

为什么应该使用 strtok(line, "\n") **not** 去除 fgets() 留下的换行符

fgets()是一个读取一行输入的安全函数,但它会将从文件中读取的新行字节存储'\n'在数组中(如果合适的话)。

在许多情况下(如果不是大多数情况),必须在进一步处理行内容之前删除此新行

可以使用几种简单的方法,但我看到了一个紧凑而棘手的建议:

strtok(line, "\n");    // strip the newline
Run Code Online (Sandbox Code Playgroud)

为什么这种方法不正确,为什么它并不总是有效?

c newline fgets strtok

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

为什么malloc是16字节对齐的?

GNU文档指出,它malloc在 64 位系统上与 16 字节倍数对齐。为什么是这样?

如果我的理解是正确的,寄存器和所有指令都对最大 8 字节宽的值进行操作。因此,似乎需要 8 字节对齐。

笔记:

c memory x86-64 memory-alignment

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

为什么for循环没有结束?

我编写了一个程序,将变量定义npint并使用 对其进行初始化getchar。但这样程序就不会退出for循环。如果我使用scanf它运行良好。为什么会发生这种情况?

#include <stdio.h>
#include <stdlib.h>

typedef struct parents {
    char fathername[30];
    char Mothername[50];
} parents;

struct person {
    char firstname[30];
    char Lastname[30];
    int age;
    parents p;
};

int main() {
    int np;
    printf("The number of people: ");
    np = getchar(); //scanf("%d", &np);

    struct person *point = malloc(np * sizeof(struct person));

    int i = 0;
   
    for (i = 0; i < np; i++) {
        printf("Give your name: ");
        scanf("%s", &point[i].firstname); …
Run Code Online (Sandbox Code Playgroud)

c

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