随笔分类 - C Language
new与malloc的区别
摘要:1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。4.C++程序经常要调用
阅读全文
二维数组和指向指针的指针
摘要:一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#include<stdio.h>void main(){ char **p,a[6][8]; p = a; printf("\n");}编译,然后就会发现通不过,报错:错误1error C2440: “=”: 无法从“char [6][8]”转换为“char **”于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。方法一,函数是 void fun(int arr[2][3]); 这
阅读全文
指针做形参做局部变量以及内存分配
摘要:一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,即不能让他指向一个新的一维指针。所以二维指针传递的是一个一维指针。具体看下面这个程序以及输出:#include<stdio.h>#include <malloc.h>#include
阅读全文
程序在的内存中的分配(常量,局部变量,全局变量,程序代码)
摘要:一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- 程序结束释放在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变
阅读全文
static作用(修饰函数、局部变量、全局变量)
摘要:在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容chara='A';//globalvariablevoidmsg(){printf("Hello\n");}下面是main.c的内容intmain(void){externchara;//externvariablemustbedeclaredb
阅读全文
strcpy和memcpy的区别
摘要:strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。void *memcpy( void *dest, const void *src, size_t count );char * strcpy(char * dest, const char * src) // 实现
阅读全文
库函数itoa的C语言实现
摘要:该程序实现的比较简洁,大致的思想是这样的,要精益求精可以随意改进。#include <stdio.h>void main(){ int num = 123456; char str[7]; char temp[7]; int i = 0,j = 0; while(num != 0) { temp[i] = num%10 + '0';//将整数转换为数字字符 i++; num = num/10; } temp[i] = '\0';//对数组进行赋值的时候千万不要忘记最后一个单位赋上字符串结束符,否则后面有乱码 i--;//让i指向字符串结束符前面那个字
阅读全文