cs241 mini_memcheck notepad

这篇博客介绍了cs241 mini_memcheck notepad中的内存管理概念,包括stdout和stderr的区别,extern外部变量的声明,以及malloc、calloc和realloc在C语言中的使用和功能。此外,还探讨了Linux下的readlink函数和Debug与Release模式的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cs241 mini_memcheck notepad
stdout和stderr的区别

stdout – 标准输出设备 stdout。
stderr – 标准错误输出设备
两者默认向屏幕输出。
但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。 在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出。

extern外部变量

​ 如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

malloc/calloc/realloc

malloc函数

malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下:

void * malloc(int n);

参数释义:
n:申请空间大小(单个类型大小*总个数)

函数详述:
其中,形参n为要求分配的字节数。如果函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。由于malloc函数值的类型为void型指针,因此,可以将其值类型转换后赋给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
需要注意的是,malloc函数分配得到的内存空间是未初始化的。
注意:通过malloc函数得到的堆内存必须使用memset函数来初始化。

  1. calloc函数

calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。其函数声明如下:

void *calloc(int n,int size);
参数释义:
size:单个类型大小
n:申请的个数
注意:最后申请空间大小为: n和size相乘

函数详述:
函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间,并返回该空间的首地址。如果执行失败,函数返回NULL。该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

  1. realloc函数

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:

void * realloc(void * p,int n);

参数释义:
p:堆上已经存在空间的地址
n:空间的大小

函数详述:
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。relloc函数分配的空间也是未初始化的。

注意:使用malloc函数,calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。

linux下readlink函数详解

函数原型

int readlink(const char* path, char* buf, size_t bufsiz);

函数说明:readlink()会将参数path 的符号连接内容存到参数buf 所指的内存空间

​ linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径,

sample:

#include <unistd.h>
#include <stdio.h>
int main(int argc , char* argv[])
{
    char buf[1024] = { 0 };
    int n;
    n = readlink("/proc/self/exe" , buf , sizeof(buf));
    if( n > 0 && n < sizeof(buf))
    {
        printf("%s\n" , buf);
    }
}
Debug和Release的区别是什么

​ Debug 是“调试”的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是“原汁原味”的。

​ Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。

c库函数strncat()
char *strncat(char *dest, const char *src, size_t n)

描述把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,

  • n – 要追加的最大字符数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值