struct A{
int V[100];
};
void f(A a)
{
a.V[0]=30;
}
int main()
{
A a;
a.V[0]=10;
f(a);
cout<<a.V[0];
}
Run Code Online (Sandbox Code Playgroud)
我期望30作为输出,而不是我获得10.我知道,如果参数是通过值传递的,数组(也可以是类/结构的成员)通过引用传递.相反,当成员,他们通过副本传递.是真的?
我正在学习K&R书.我目前在第4章.我正在阅读第71页的atof()函数.函数atof(s)将字符串转换为其双精度浮点等效值.
atof()的代码如下:
// atof:将string s转换为double
double atof2(char s[])
{
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); ++i) //skip white space
;
sign = (s[i] == '-') ? -1: 1;
if (s[i] == '-' || s[i] == '-')
++i;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
++i;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= …Run Code Online (Sandbox Code Playgroud) 在编码时我遇到了一个问题:
当我必须使用大量for循环时,所有迭代都在不同的范围内.如果我只将一个变量声明为索引(示例I)或者它根本不重要(示例II),那么性能(即运行时)会更好吗?
例I:
int ind;
for(ind=0; ind < a; ind++) { /*do something*/ }
for(ind=0; ind < b; ind++) { /*to something*/ }
...
for(ind=0; ind < z; ind++) { /*to something*/ }
Run Code Online (Sandbox Code Playgroud)
例二:
for(int ind=0; ind < a; ind++) { /*do something*/ }
...
for(int ind=0; ind < z; ind++) { /*do something*/ }
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
据我所知,以下代码在C11中表现出未定义的行为:
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa *pointer = &buffer[0];
return (*pointer).cccc;
}
Run Code Online (Sandbox Code Playgroud)
根据N1570第6.5.3.2节第4条,
如果为指针分配了无效值,
*则未定义一元运算符的行为.
附有一个澄清的脚注
在由一元运算
*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.
它不太可能struct aaaa *并且unsigned char *具有相同的对齐,因此我们为其分配了无效值pointer,*pointer因此使用UB.
但是,我可以复制结构吗?
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa target;
memcpy(&target, buffer, …Run Code Online (Sandbox Code Playgroud) 如果我定义一个带有参数的宏,如下所示。
#define define_int(a) int a;
Run Code Online (Sandbox Code Playgroud)
并提供一个参数,中间有空格,如下所示
define_int(* a)
Run Code Online (Sandbox Code Playgroud)
并得到输出?
int * a;
Run Code Online (Sandbox Code Playgroud)
有可能的使用
#define ASSIGN(A,B) B=A;
Run Code Online (Sandbox Code Playgroud)
我想直接使用这个宏从函数返回
ASSIGN(A, return B)
Run Code Online (Sandbox Code Playgroud)
这样它就会输出,
return B = A;
Run Code Online (Sandbox Code Playgroud) 我需要通过芯片读取每张可能卡的 PAN 代码。在我的工作中,我必须只使用 C,而且我没有可以帮助我完成这项无聊任务的例程。这就是我使用的 APDU 步骤:
1) 选择 1PAY.SYS.DDF01
00 A4 0400 0E 315041592E5359532E4444463031
Run Code Online (Sandbox Code Playgroud)
然后00 C0 0000 22 315041592E5359532E4444463031从响应中读取所有数据。完整回复:
6f 20 e 84 31 50 41 59 2e 53 59 53 2e 44 44 46 30 31 a5 e 88 1 1 5f 2d 69 8 74 65 6e 66 72 65 73 90
2) READ RECORD 获取特定的 AID
00 B2 010C 00
Run Code Online (Sandbox Code Playgroud)
完整回复:
70 17 61 15 4f 7 a0 0 0 0 4 30 60 50 …Run Code Online (Sandbox Code Playgroud) 我正在为 PIC 18F45K42 编写代码,以从 HCSD 卡读取 .wav 文件。我正在使用 MPLAB X IDE v5.20 和 XC v2.05。我正在使用 FATF 库从卡上读取数据。
我可以从卡上读取数据并获得良好的结果,直到组合代表 .wav 文件大小的 4 个字节。
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte) \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? …Run Code Online (Sandbox Code Playgroud) 我一直在玩 C 语言的 Game Boy Advance 编码。为了使中断正常工作,必须将中断处理程序例程的地址手动复制到 RAM 位置 0x03007FFC。我知道如何在 ARM Assembly 中执行此操作,但不知道如何在 C 中执行此操作。我正在尝试这样的操作:
#define REG_INTERRUPT *(vu32*)0x03007FFC
void irqhandler()
{
while(1){}
}
int main()
{
REG_INTERRUPT = &irqhandler();
while(1){}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用。根据我对 C 函数的理解,C 似乎认为我正在尝试获取返回值的地址irqhandler(因为它是空的,所以没有返回值),这就是错误的来源。我如何告诉 C 我想要函数本身的内存位置?
代码行
\nnext += val;\nRun Code Online (Sandbox Code Playgroud)\n性能下降到 10 倍,我检查了 ASM 代码,而不是结果。
\n为什么这行代码会使性能下降 10 倍?
\n结果如下:
\n\xe2\x9e\x9c ~ clang-13 1.c -O3\n\xe2\x9e\x9c ~ ./a.out\nrand_read_1\nsum = 2624b18779c40, time = 0.19s\nrand_read_2\nsum = 2624b18779c40, time = 1.24s\nRun Code Online (Sandbox Code Playgroud)\nCPU:Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz
\n这是代码:
\n#include <stdio.h>\n#include <time.h>\n#include <stdint.h>\n#include <unistd.h>\n#include <string.h>\n#include <assert.h>\n#include <stdlib.h>\n\n#define CCR_MULTIPLY_64 6364136223846793005\n#define CCR_ADD_64 1\nstatic inline uint64_t my_rand64(uint64_t *r)\n{\n *r = *r * CCR_MULTIPLY_64 + CCR_ADD_64;\n return *r;\n}\n\n#define NUM 10000000UL\n\nuint64_t rand_read_1(uint64_t *ptr, uint64_t nr_words)\n{\n uint64_t i, next, …Run Code Online (Sandbox Code Playgroud)