小编hac*_*cks的帖子

为什么我们需要转换malloc返回的内容?

    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的结构

c heap malloc

6
推荐指数
3
解决办法
6752
查看次数

C中的序列点和副作用

在这个C-FAQ中给出了序列点 ;

标准规定:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.

在例子中

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 undefined-behavior sequence-points

6
推荐指数
2
解决办法
830
查看次数

为什么在下一个代码c = 1?

为什么在下一个代码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)

c

6
推荐指数
2
解决办法
232
查看次数

#include在代码中间

我想在我的程序中有条件地包含头文件.是否可能,如果可以,我该怎么做?

我的想法是做这样的事情:

switch(opt)
{
case 0:
    {
        #include "matrix.h"
        break;
    }
case 1:
    {
        #include "grid.h"
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是VS在我写这篇文章时的表现.这样对吗?

c header

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

在C中释放内存的需求是什么?

我可能会被误导,但据我所知,操作系统会在程序退出或崩溃后清理内存.

如果是这样,在程序结束时释放内存有多大用处?我知道如果一个程序正在运行并且忽略了解除分配,那么内存可能会变得"满",但如果一个程序已经结束并且操作系统解除了程序使用的所有内存,那么手动解除分配该内存的意义何在?

c memory operating-system

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

使用malloc(0)和memcpy

我在某处读到:取消引用由大小为零的"新"分配返回的指针是UB.在C中是否相同?如果是,是以下代码UB?(假设大小= 0)

 a->object[index].data = malloc(size);  
 memcpy(a->object[index].data, bytes, size);
Run Code Online (Sandbox Code Playgroud)

据我了解:不.只是想仔细检查一下.

c malloc undefined-behavior

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

这两个参数在typedef中意味着什么?

我有一段代码,我不明白那一个typedef:

typedef void (inst_cb_t) (const char*, size_t);
Run Code Online (Sandbox Code Playgroud)

不,实际上意味着你可以使用inst_cb_tvoid呢?但是第二个括号中的内容呢?

c typedef function

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

我可以假设NULL值作为假吗?

我知道,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)

c comparison pointers null-pointer conditional-statements

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

C中的结构和功能范围有什么区别?

考虑一下这段代码

   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"是正确的; 作为结构内部的声明,但在函数内部有这个定义是不正确的?

c struct

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

假设我们有结构填充,int的大小为4,double的大小为8字节,下面这段代码中结构的大小是多少

任何人都可以告诉我,下面显示的结构的大小是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.

c structure padding

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