众所周知,它与初始化分配的内存calloc不同malloc.使用时calloc,内存设置为零.使用时malloc,内存不会被清除.
所以在日常工作中,我认为calloc是malloc+ memset.顺便说一下,为了好玩,我为基准编写了以下代码.
结果令人困惑.
代码1:
#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)calloc(1,BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码1的输出:
time ./a.out
**real 0m0.287s**
user 0m0.095s
sys 0m0.192s
Run Code Online (Sandbox Code Playgroud)
代码2:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)malloc(BLOCK_SIZE);
memset(buf[i],'\0',BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2的输出:
time ./a.out
**real 0m2.693s**
user 0m0.973s
sys 0m1.721s
Run Code Online (Sandbox Code Playgroud)
更换 …
我的团队C代码指南写道,最好在注释中放置一个'<',如下所示:
#define MAX_PACK_ITEM_NUM 50 /**< max number of item */
Run Code Online (Sandbox Code Playgroud)
我想知道,这个'<'的实际用途是什么?
我有一个问题,因为下面的代码描述了自己.
1 #include<stdlib.h>
2 #include<stdio.h>
3 void log()
4 {
5 printf("Log [Line:%d]\n",__LINE__);
6 }
7 int main()
8 {
9 log();
10 log();
11 }
Run Code Online (Sandbox Code Playgroud)
预期的结果是
Log [Line:9]
Log [Line:10]
但是,事实是
Log [Line:5]
Log [Line:5]
毫不奇怪,LINE在预处理阶段被替换为5.
我的问题是,如何设计日志函数以获得预期结果?
谢谢!
像这样的场景:
我有不同的对象执行与各自func()实现的类似操作.
func_manager()有两种解决方案可以根据不同的对象调用func()
解决方案1:使用c ++中指定的虚函数字符.func_manager以不同的方式对不同的对象点传入进行工作.
class Object{
virtual void func() = 0;
}
class Object_A : public Object{
void func() {};
}
class Object_B : public Object{
void func() {};
}
void func_manager(Object* a)
{
a->func();
}
Run Code Online (Sandbox Code Playgroud)
解决方案2:使用普通开关/外壳.func_manager的工作原理与不同类型的传入不同
typedef enum _type_t
{
TYPE_A,
TYPE_B
}type_t;
void func_by_a()
{
// do as func() in Object_A
}
void func_by_b()
{
// do as func() in Object_A
}
void func_manager(type_t type)
{
switch(type){
case TYPE_A:
func_by_a();
break;
case TYPE_B:
func_by_b();
default: …Run Code Online (Sandbox Code Playgroud) 在阅读我的小组项目的代码时,我遇到了许多DEFINE,其中一些似乎很奇怪.要概括它,请查看以下2个示例.
例1:
#define SNPRINTF(dst, fmt, arg...) snprintf(dst, sizeof(dst), fmt, ##arg)
Run Code Online (Sandbox Code Playgroud)
"##"在这种情况下意味着什么?我试图删除他们两个,并写这样的代码 "字符BUF [1024]的snprintf(buf中," %S%S " "ABCD", "EFG");" 这产生了相同的结果.所以"##"似乎毫无用处,对我没有任何伤害.
例2:
#define CLOSE(fd) do { \
if (-1 != (fd)) { \
close(fd); \
(fd) = -1; \
} \
} while (0)
Run Code Online (Sandbox Code Playgroud)
有必要将内部代码填充到do{}while(0)语句中吗?什么用途?