
C语言
文章平均质量分 53
新一下的兰天
紧要关头不放弃,绝望就会变成希望
展开
-
C语言之数据类型
1、数据类型是固定内存块大小的别名,也就是说申明变量为一种数据类型就是告诉编译器分配多少内存给我。看这么一段代码:#include"stdio.h"#include"stdlib.h"int main() { int a[10]; //告诉编译器分配40个字节 printf("a : %d, a + 1 : %d, &a : %d, &a + 1 : %d\n", a, a原创 2016-06-25 16:09:54 · 304 阅读 · 0 评论 -
自动类型转换
我们都知道多数编程语言都有类型自动转换的功能,那到底那些类型之间可以自动转换呢,一般主要遵循两点: 1、目标类型与源类型兼容,比如double和int之间2、目标类型大于源类型,比如double占8字节,int占4字节,那么当把一个int类型赋给一个double类型的变量时,int可以自动转换成double类型在java中类型比C++更严格,java不能从double类型自动转换成int,但C++原创 2016-08-10 15:36:58 · 340 阅读 · 0 评论 -
主调函数分配内存的两次调用
主调函数中的指针所指向的内存空间可以在当前函数中直接分配,也可以在被调函数中分配,同样可以二次调用被调函数,第一次让被调函数返回一个内存空间的大小,然后在主调函数中根据被调函数返回的空间大小分配内存,第二次调用往主调函数分配的内存空间中写入数据。这也是项目开发过程中会用到的一种内存分配方式,所以在这里说明一下:#define _CRT_SECURE_NO_WARNINGS#include<stdi原创 2016-08-01 10:37:29 · 994 阅读 · 0 评论 -
字符串的操作
一、字符串的初始化 1、定长字符数组1>char buf1[128] = {'a', 'b', 'c', 'd'};printf("sizeof(buf1) = %d\n", sizeof(buf1)); //128printf("strlen(buf1) = %d\n", strlen(buf1)); //4printf("buf1[66] : %d\n", buf1[66])原创 2016-07-08 23:21:03 · 1014 阅读 · 0 评论 -
指针
铁律1:指针也是一种数据类型一、指针1、指针是一种变量,占有内存空间,用来把保存内存地址。指针的大小在32位平台下是4字节,64位平台下是8字节。2、*p操作内存1> *p放在等号左边,相当于对指向的内存空间赋值。#include"stdio.h"#include"stdlib.h"int main() { int a = 10; int *p = &a; *p = 20;原创 2016-06-26 12:58:00 · 587 阅读 · 0 评论 -
二级指针的三种内存模型
char* p1[] = {"123, "456", "789"}; //第一种char p2[3][4] = {"123, "456", "789"}; //第二种char **p3 = (char**)malloc(sizeof(char*) * 3); //第三种for(int i = 0; i < 3; i++){ p3[i] = (char*)malloc(10原创 2016-07-17 09:27:33 · 315 阅读 · 0 评论 -
释放内存出现HEAP CORRUPTION DETECTED错误
今天敲代码,出现了HEAP CORRUPTION DETECTED错误,本来指针分配内存,最后再释放内存空间是天经地义的事情,竟然报错,开始也摸不着头脑,最后百度了一下,最终发现问题是,我分配了len长度的空间,我却用到了len + 1的长度,释放的时候就报错了。贴下我的代码,主要是实现将两种内存模型里的数据拷贝到第三种内存模型中,并且排序输出:#define _CRT_SECURE_NO_WARN原创 2016-07-24 10:17:24 · 8546 阅读 · 0 评论 -
指针常遇到的问题
指针是个涉及到内存,很容易产生bug的根源,总结了几点指针容易出错的问题:1、对于多级指针,不要在多个函数中分配内存空间,例如:void func(char** p){ for(int i = 0; i < 5; i++){ p[i] = (char*)malloc(sizoef(char) * 100); }}int main(){ char** p =原创 2016-07-19 10:13:24 · 1023 阅读 · 0 评论 -
数组、指针数组与数组指针
一、数组类型注意: (1)数组首元素的地址与数组地址是完全两个不同的概念int a[10];printf("a : %d, a + 1 : %d\n", a, a + 1);printf("&a : %d, &a + 1 : %d\n", &a, &a + 1);输出结果:(2)数组元素的首地址是常量,不能修改,这是为了释放内存空间所必需的,否则找不到释放内存空间的首地址了(3)定义一个数原创 2016-07-19 09:58:18 · 735 阅读 · 0 评论 -
(转)#ifndef 与 #program once 的区别
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #en转载 2016-06-30 14:57:13 · 585 阅读 · 0 评论 -
C语言之数组做参数退化问题
先来个冒泡排序的简单实现来说明整个问题:#include"stdio.h"#include"stdlib.h"void print(int a[3], int num) { for (int i = 0; i < num; i++) printf("%d ", a[i]); printf("\n");}void sortfunc(int a[3], int num原创 2016-06-25 15:30:11 · 848 阅读 · 0 评论 -
静态存储区的内存四区
一、操作系统是如何执行exe程序的?1、操作系统首先把物理磁盘代码load到内存;2、操作系统把C代码分成四分区;3、操作系统找到main函数入口执行二、内存四区1、栈区:局部变量存放的位置,因为局部变量出了作用域会被析构释放空间,所以也叫临时区;2、堆区:需要手动分配和释放内存的区,由malloc和new分配,free和delete释放;3、全局区:全局变量,静态变量,常量存放的位置,相同的常量在原创 2016-06-25 20:07:39 · 1816 阅读 · 0 评论 -
函数调用模型-主调函数与被调函数
一、函数调用模型:返货都是先以返回地址,函数参数,执行状态的顺序依次压栈的,函数执行完毕再从上到下依次弹栈。二、函数调用模型中的内存管理还是以上面那个图为例:1、main函数中,可以在栈区、堆区、全局区开辟空间,这些内存空间都可以在fa和fb函数中使用2、fb函数中,在栈上开辟的内存空间,不能在fa和main函数中使用,因为出了fb函数就被析构掉了。3、fb函数中,在堆区开辟的内存空间,可以在fa和原创 2016-06-26 10:38:49 · 3484 阅读 · 0 评论 -
栈区的地址增长方向与buf地址的增长方向是两个完全不同的概念
一、栈区的地址增长方向要想验证栈区究竟是开口向上还是开口向下,都进行先压变量a再压变量b的操作,若a的首地址比b的首地址大则说明开口向下,若b的首地址比a的首地址大,则说明开口向上,下面就用代码来验证一下:#include"stdio.h"#include"stdlib.h"int main() { int a; int b; printf("&a : %d\n", &a)原创 2016-06-26 09:50:33 · 2082 阅读 · 0 评论 -
内存四区之堆栈区
一、堆区先看一个例子:#include"stdio.h"#include"stdlib.h"#include"string.h"char* getval(int num) { char* p = NULL; p = (char*)malloc(sizeof(char) * num); strcpy(p, "123456789"); if(p == NULL)原创 2016-06-26 08:58:37 · 1751 阅读 · 0 评论 -
C语言之变量的本质
一、变量的本质变量的本质是一段连续内存空间的别名,或者说变量是一段连续内存空间的门牌号,画个图:不管是标准数据类型,还是指针(指针也是一种数据类型),都是一样的,都是内存空间的门牌号,千万不好把变量画到内存中去。二、通过变量往内存中进行读写数据三、修改内存的方法1、直接int a = 10;a = 20;2、间接#include"stdio.h"#include"stdlib.h"#inclu原创 2016-06-25 16:42:19 · 2822 阅读 · 0 评论 -
宏定义
宏定义不管在C还是C++中都经常用到,其用法是个比较神奇的东西,宏定义不表示任何类型,同样也表示任何类型,这也是宏定义的一个优点,宏函数类似C++的函数重载,可以用于任何类型,但不进行类型检查,宏定义实际代表的就是一个字符串,比如下面这段代码#include<iostream>using namespace std;#define M int main(M) { cout << "hello原创 2016-08-15 09:34:09 · 358 阅读 · 0 评论