我习惯于像下面那样长时间编码.
但是C编译器如何解决循环定义问题?或者这个问题真的存在吗?
struct node {
int data;
struct node *next; // circular definition for "struct node" type?
};
Run Code Online (Sandbox Code Playgroud)
或者,在32位机器上,我可以将struct node * next成员视为32位无符号整数类型的成员吗?这让我感觉好多了.
我想循环定义的原因是,当编译器遇到类似next -> data或者next -> next,它必须知道确切的偏移每个成员添加到next指针以获得每个成员的正确位置.而这种计算需要了解每个成员的类型.因此,对于该成员next,可能会出现循环定义问题:
类型
next是struct node *,struct node类型包含anext,类型next是struct node *...
编译器如何计算sizeof(struct node)?
好吧,我认为理解这个看似圆形的问题的关键概念是,指针的大小与它指向的类型无关.并且尺寸固定在特定的机器上.指针的类型仅在编译时有意义,以便编译器生成指针计算指令.
据说是因为libxml2unsigned char用作存储,方便字符集之间的编码/解码----在读取/创建xml节点名称,内容,文本时,强制用户在代码中到处写“BAD_CAST”是不是很丑陋节点等
有没有办法避免到处写这样的“BAD_CAST”?设计真的太差了。
声明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)
虽然这是不便携的,比我希望的要长一点.
如何最好地实现这一目标?
所以我试图使用这个函数读取整个文本文件:
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行了。它带回文件并在最后添加一些垃圾。任何想法我做错了什么?
我处理的代码有很多正在制成铸件uint8来char,然后将C库函数呼吁这个castings.I试图理解为什么会作家喜欢uint8过char.例如:
uint8 *my_string = "XYZ";
strlen((char*)my_string);
Run Code Online (Sandbox Code Playgroud)
发生什么事\0,是否在我演员时添加?
当我转过身来时会发生什么?
这是一个工作的合法的方式,为什么会有人喜欢用合作uint8过char?
我正在使用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) 错误如下(倒数第二行):
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) fgets()是一个读取一行输入的安全函数,但它会将从文件中读取的新行字节存储'\n'在数组中(如果合适的话)。
在许多情况下(如果不是大多数情况),必须在进一步处理行内容之前删除此新行。
可以使用几种简单的方法,但我看到了一个紧凑而棘手的建议:
strtok(line, "\n"); // strip the newline
Run Code Online (Sandbox Code Playgroud)
为什么这种方法不正确,为什么它并不总是有效?
GNU文档指出,它malloc在 64 位系统上与 16 字节倍数对齐。为什么是这样?
如果我的理解是正确的,寄存器和所有指令都对最大 8 字节宽的值进行操作。因此,似乎需要 8 字节对齐。
笔记:
x86_64我编写了一个程序,将变量定义np为int并使用 对其进行初始化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)