`
jimmee
  • 浏览: 538832 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

c内存操作感悟(1)

阅读更多

直接使用c, 有个好处, 自己可以完全控制内存啊,一切脑海中记住内存及指针, 就很容易知道操作是怎样.

 

1. 分配一段内存, 这段内存使用什么样的指针操作, 那么对应就是多少字节的操作, 也就是说, 看你怎么去解释

这块内存了.

 

例如, 若分配给一个10个字节的类型, 如果用一个int类型的指针指向这块内存, 那么一次操作, 就是int的字节的大小, 如果一个struct指向这块内存, 那么一次操作就是针对这个struct的内存的大小, 如果是一个数组指向这块内存,  那么就是连续的这个数组的元素类型的字节了.

 

2. 怎么改变内存中指针的指向, 进行指针的加减就行了, 但是指针加减,  这个和指针的类型有关系的.

 

 

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int i;
	char c;
} tag;

int main(void) {
	tag *t = (tag *)malloc(20);
	tag *t2 = t+1;
	printf("%d\n", sizeof(tag));
	printf("%p\n", t);
	printf("%p\n",t2);
	return EXIT_SUCCESS;
}

 

 

上述代码的打印结果:

8

001A3D10

 

001A3D18

 

3. struct存在对齐问题, 所以上述示例的的struct的实际大小不是5, 而是8

 

4.  怎么实现变长数组? 示例:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int i;
	char c[0];
} tag;

int main(void) {
	tag *t = (tag *)malloc(13);
	printf("%d\n", sizeof(tag));
	t->i=4;
	memcpy(t->c,"hijimmee", 8);
	t->c[8]='\0';
	printf("%s\n",t->c);

	free(t);
	return EXIT_SUCCESS;
}

 

   更具体的例子:

 

#include <stdlib.h>
#include <stdio.h>

typedef unsigned long     cell;

/* INSTANCE */
struct instanceStruct {

    // 这里的数组仅仅是占位, data[]数组不仅仅只有一个元素, 可以使用更大的index值来存取
    // data[1]之后的元素值
    union {
        cell *cellp;
        cell cell;
    } data[1];
};

struct instance {
	int num;
	int arr[2];
};

int main(void) {
	int size = sizeof(cell) * 3;
	printf("%d\n", size);

	printf("%lu\n", sizeof(instanceStruct));

	instanceStruct *ins = (instanceStruct *) malloc(size);
	cell *c = (cell *)malloc(sizeof(cell));
	ins->data[0].cell = 5;
	ins->data[1].cell = 15;
	ins->data[2].cell = 155;
	*c = 157;
	printf("%lu,%lu,%lu, %lu\n", ins->data[0].cell, ins->data[1].cell, ins->data[2].cell);

	printf("%d\n", sizeof(instance));

	instance *s = (instance *) malloc(sizeof(instance) * 2);
	s->num = 1;
	s->arr[0] = 2;
	s->arr[1] = 3;
	instance *first = s;
	s++;
	s->num = 4;
	s->arr[1] = 5;
	s->arr[2] = 6;
	printf("%d, %d, %d\n", first->num, first->arr[0], first->arr[1]);
	printf("%d, %d, %d\n", s->num, s->arr[0], s->arr[1]);
	// 这里可以看到,实际上不管是否数组是否越界了,永远根据指针类型进行访问
	printf("overflow access: %d\n", first->arr[2]);
}

   我64位的机器,输出结果如下:

  

24
8
5,15,155, 12
12
1, 2, 3
4, 13, 5
overflow access: 4

 

分享到:
评论

相关推荐

    2022年大学c语言学习心得感悟.docx

    3. **指针**:指针是C语言的一大特色,它能存储内存地址,允许直接操作内存,提供了高效的数据操作方式。理解指针需要掌握指针的声明、初始化、解引用以及指针运算。 4. **数组与字符串**:数组是一组相同类型的...

    Java学习总结[C程序员的感悟]

    ### Java学习总结:C程序员的感悟 #### 第一章:Java入门(C与Java的差异) ##### 基本数据类型: Java的数据类型与C语言相比,在命名上有一定区别,例如整型在C中为`int`,而在Java中也为`int`,但Java的数据...

    C语言指针学习笔记

    数据类型不仅决定了变量所占用的内存大小,还决定了变量的操作方式。 ##### 1. 基本数据类型 - **整型 (int)** - 用于存储整数值。 - **字符型 (char)** - 用于存储单个字符。 - **浮点型 (float/double)** - `...

    2022年C语言实习心得5篇精选集合最新.docx

    - 指针是C语言的灵魂,它提供了直接访问内存地址的能力,使得动态内存管理和高效的数据操作成为可能。 - 指针与数组、结构体的结合使用,能够实现更灵活的数据结构,但也是学习中的一大难点。 6. **学习策略**: ...

    C语言学习心得

    因此,我们需要学习 C 语言的注意事项,例如指针和数组的区别、数组名和函数名的使用、结构体中的内存对齐、指针数组和数组指针的区别等。 学习 C 语言需要我们耐心、细心、实践和总结。只有通过大量的上机实践、多...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    第1章 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2章 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 ...

    学生成绩管理系统(附说明感悟)课程设计作业

    对于成绩的管理,可能需要使用链表或数组来存储大量的学生数据,这涉及到动态内存分配和数据结构的操作。 接着,系统需要有用户交互界面,通常以命令行菜单的形式呈现。这需要掌握控制台输入输出操作,如`printf`和...

    攻破C语言笔试与机试难点

    正确管理内存对于编写高效、稳定的C程序至关重要。书中可能还提到了数组和字符串的操作,这些是C语言笔试和机试中经常考察的知识点。此外,数字运算符的使用也是编程中不可或缺的一部分,作者可能在书中对各种运算符...

    C语言课程设计报告_我的心得体会

    在“C语言课程设计报告_我的心得体会”这个主题中,我们可以深入探讨C语言的基本概念、课程设计的关键要素以及个人在学习过程中的体验和感悟。C语言是一种基础且强大的编程语言,广泛应用于系统开发、嵌入式系统、...

    操作系统课程设计操作系统 大三的课程设计 报告和源代码 相当的实用。

    如果数据存在,即发生缓存命中,那么就可以直接从内存中快速获取,避免了较慢的磁盘I/O操作。如果数据不在缓存中,系统会从块设备读取数据,并将其存入高速缓冲区,以备后续使用。对于写操作,高速缓冲区同样扮演...

    操作系统实验课代码

    通过实验掌握1-2种操作系统的界面,了解命令和调用的工作流程,深入理解操作系统的内部运作机制。目标是使学生能够熟练使用操作系统环境,掌握各种命令和功能,有效利用计算机资源。 #### 示例 以Windows和Linux/...

    C语言深度剖析

    最后,可能还包括了C语言的标准化历程,如C89、C99、C11等标准的差异,以及如何遵循标准编写跨平台的C代码。这有助于读者编写出更规范、更具移植性的程序。 通过《C语言深度剖析》这本书,读者不仅可以全面掌握...

    C语言飞机售票系统

    - `menu1()`函数可能包含更详细的子菜单或操作选项。 4. **`browse()`函数**: - 显示所有航班的信息。 - 调用`printf_one()`函数来格式化输出每一条航班记录。 5. **`order()`函数**: - 实现购票功能。 - ...

    2022年c语言的学习心得.docx

    标题中的“2022年c语言的学习心得”表明了本文是关于学习C语言的个人体验和感悟,而“考试”标签则暗示了这可能是针对考试准备或技能考核的学习总结。主要内容提到了学习C语言的过程,包括遇到的问题、解决方法以及...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    第1章 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2章 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 ...

    LinuxC语言学习感悟

    "Linux C语言学习感悟" 在 Linux 和 C 语言学习的过程中,我逐渐体验到了蜕变的重要性。从一开始的无知到现在的自信,都是一步步的成长。经历了指针、数组、链表、队列、树、IO 和网络编程等知识点的学习和实践,才...

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO ...

Global site tag (gtag.js) - Google Analytics