int length = strlen(src);
char *structSpace = malloc(sizeof(String) + length + 1);
String *string = (String*) structSpace;
int *string = (int*) structSpace;
Run Code Online (Sandbox Code Playgroud)
*我创建了一个名为String的结构
标准规定:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.
在例子中
i = i++;
a[i] = i++;
Run Code Online (Sandbox Code Playgroud)
从声明的第一句可以清楚地看出,这些例子是未定义行为的结果.
在解释声明的第二句时,据说;
第二句话说:如果一个对象被写入一个完整的表达式,那么同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值.此规则有效地将法律表达式约束为在修改之前明显存在访问的表达式.例如,旧备用
i = i + 1
Run Code Online (Sandbox Code Playgroud)
是允许的,因为i的访问用于确定i的最终值.这个例子
a[i] = i++
Run Code Online (Sandbox Code Playgroud)
是不允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生),因此没有好的方法来定义.
我的问题是;
1.它是什么意思,如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问必须直接参与计算要写入的值.?
2.它是什么意思,该示例a[i] = i++
是不允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生)
可能有人以一种简单的方式解释它吗?
为什么在下一个代码c = 1?
#include <stdio.h>
int main()
{
int i = 65537;
char c = (char)i;
printf("c = %d\n",c); /* why c =1 */
return(0);
}
Run Code Online (Sandbox Code Playgroud) 我想在我的程序中有条件地包含头文件.是否可能,如果可以,我该怎么做?
我的想法是做这样的事情:
switch(opt)
{
case 0:
{
#include "matrix.h"
break;
}
case 1:
{
#include "grid.h"
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是VS在我写这篇文章时的表现.这样对吗?
我可能会被误导,但据我所知,操作系统会在程序退出或崩溃后清理内存.
如果是这样,在程序结束时释放内存有多大用处?我知道如果一个程序正在运行并且忽略了解除分配,那么内存可能会变得"满",但如果一个程序已经结束并且操作系统解除了程序使用的所有内存,那么手动解除分配该内存的意义何在?
我在某处读到:取消引用由大小为零的"新"分配返回的指针是UB.在C中是否相同?如果是,是以下代码UB?(假设大小= 0)
a->object[index].data = malloc(size);
memcpy(a->object[index].data, bytes, size);
Run Code Online (Sandbox Code Playgroud)
据我了解:不.只是想仔细检查一下.
我有一段代码,我不明白那一个typedef:
typedef void (inst_cb_t) (const char*, size_t);
Run Code Online (Sandbox Code Playgroud)
不,实际上意味着你可以使用inst_cb_t的void呢?但是第二个括号中的内容呢?
我知道,NULL == (void *)0但提到它可以表示为一个不包含全零的值.困扰我的是,如果这些代码片段对所有代码都是等价的(any_type *):
any_type *val;
if (val) { ... };
Run Code Online (Sandbox Code Playgroud)
和
if (val != NULL) { ... };
Run Code Online (Sandbox Code Playgroud) 考虑一下这段代码
int main(void)
{
typedef struct {
int i;
} s;
struct {
s s;
} t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它汇编很好.现在来看看这一个
int main(void)
{
typedef struct {
int i;
} s;
s s;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码不会编译 -
‘s’ redeclared as different kind of symbol.
Run Code Online (Sandbox Code Playgroud)
问题:为什么拥有"ss"是正确的; 作为结构内部的声明,但在函数内部有这个定义是不正确的?
任何人都可以告诉我,下面显示的结构的大小是24而不是20.
typedef struct
{
double d; // this would be 8 bytes
char c; // This should be 4 bytes considering 3 bytes padding
int a; // This would be 4 bytes
float b; // This would be 4 bytes
} abc_t;
main()
{
abc_t temp;
printf("The size of struct is %d\n",sizeof(temp));
}
Run Code Online (Sandbox Code Playgroud)
我的假设是当我们考虑填充时结构的大小将是20但是当我运行此代码时,大小打印为24.