sizeof

memset函数

匿名 (未验证) 提交于 2019-12-03 00:32:02
1.我也曾天真的以为 memset(a,0,sizeof(a)) 中的0可以用任意数替换 实际上这是错误的 memset的功能是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去。 2.介绍几个常用的 memset(a,-1,sizeof(a)) 每个都会变为-1 memset(a,0,sizeof(a)) 每个都会变为0 memset(a,0xnfnfnfnf,sizeof(a)) 每个都会变为0xnfnfnfnf memset(a,0xnf,sizeof(a)) 每个都会变为0xnfnfnfnf (可以看到简化了上面那句) 我们一般用n=3的情况(防止溢出) memset(a,0x3f,sizeof(a)) 每个都会变为0x3f3f3f3f (可以看到简化了上面那句) memset(a,127,sizeof(a)) 每个都会变为1061109567 memset(a,63,sizeof(a)) 每个都会变为1061109567 也看到过有人写 memset(a,127/3,sizeof(a)) 每个都会变为707406378 无穷大的值可采用上面的这些方法 无穷小的值 memset(a,128,sizeof(a)) 每个都会变为-2139062144 解释: 128 (128的二进制是10000000)则放的是10000000 10000000 10000000

c++程序的内存布局及类的大小讨论

匿名 (未验证) 提交于 2019-12-03 00:30:01
1.在c++中,我们了解一个数据类型在内存中所占的内存大小一般都是使用sizeof函数,他可以计算基本数据类型在内存所占的字节数。当然,对于复合的数据类型也是可以的。比如说c++中最典型的数据类型:类。使用sizeof函数也是可以返回该类所占用的空间大小。当然,类的大小和基本的数据类型的大小时有区别的,也并非是类中所有数据类型大小的简单相加。它遵循一定的规律。今天我们就来讨论一下这个问题。 2.首先我们需要了解一下c++程序的内存布局。一个c++文件・经过编译之后在内存中大致可以分为以下几个区域: (1)程序代码区:该区存放这个程序中函数的二进制代码。 (2)栈区(stack):该区存放这个程序中所有的局部变量,参数,临时变量等。该区内存的管理由操作系统完成。 (3)堆区(heap):允许程序员自行动态的申请分配内存,内存的申请和释放由程序员自己管理。该区的操作由尤其容易造成内存的提前释放与内存泄露。 (4)全局/静态区。该区用来存放程序中的全局变量以及静态变量。程序在创建这一块区域的时候会自动的将所有的字节清零。所以全局变量或者静态变量的默认值时0.该区的释放由操作系统完成。 (5)常量区:用来储存程序中的文字常量以及字符串常量。该区域的内存释放也是由操作系统完成。 3.下面我们来看一下的一段代码: #include<iostream> using namespace std;

傅立叶变换与傅立叶反变换的C语言实现

匿名 (未验证) 提交于 2019-12-03 00:27:02
/*复数的定义*/ typedef struct double double /*复数的加运算*/ return /*负数的减运算*/ return /*复数的乘运算*/ return /*快速傅立叶变换 TD为时域值,FD为频域值,power为2的幂数*/ void int int int double /*计算傅立叶变换点数*/ /*分配运算器所需存储器*/ sizeof sizeof sizeof /*计算加权系数*/ for /*将时域点写入存储器*/ sizeof /*蝶形运算*/ for for for /*重新排序*/ for for if /*释放存储器*/ /*快速傅立叶反变换,利用快速傅立叶变换 FD为频域值,TD为时域值,power为2的幂数*/ void int int /*计算傅立叶反变换点数*/ /*分配运算所需存储器*/ sizeof /*将频域点写入存储器*/ sizeof /*求频域点的共轭*/ for /*调用快速傅立叶变换*/ /*求时域点的共轭*/ for /*释放存储器*/ 文章来源: 傅立叶变换与傅立叶反变换的C语言实现

C++重定向命令行结果到文件

匿名 (未验证) 提交于 2019-12-03 00:26:01
// MyProcess.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> #include <iostream> #include <atlstr.h> using std :: string ; using std :: cout ; using std :: cin ; using std :: endl ; void GetInfoOfDos ( const string & strCmd , string & strOut ) { HANDLE hOutputRead = nullptr , hOutputWrite = nullptr ; SECURITY_ATTRIBUTES sa ; ZeroMemory (& sa , sizeof ( SECURITY_ATTRIBUTES )); sa . bInheritHandle = TRUE ; sa . lpSecurityDescriptor = NULL ; sa . nLength = sizeof ( SECURITY_ATTRIBUTES ); if ( FALSE == CreatePipe (& hOutputRead , & hOutputWrite , & sa , 0 )) { printf ( "create

sizeof(i++)

匿名 (未验证) 提交于 2019-12-03 00:26:01
朋友今天出了一道题 int main(void) { } 问i的值是多少,我想当然的问答是6。但实际运算结果是5,思考下第一反应应该是sizeof是编译时求值导致的。 先看下汇编结果: .LC0: main: .LFB0: .LFE0: 看下标记1,实际上直接求出了i对应的数据类型值 这个应该是C标准规定的: 6.5.3.4 The sizeof operator The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant 其中明确说明了sizeof在非可变长度的数组情况下操作数是不会被求值的 文章来源:

ZOJ3380 Patchouli&#039;s Spell Cards C++版(概率DP+大数)

匿名 (未验证) 提交于 2019-12-03 00:25:02
题意题解不说了,这里主要讲用C++大数 为了节省时间使用了进制压缩,使用long long数组,进制1e9,使进制的平方在long long范围内 1290ms 4836KB #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const long long mod=1000000000; struct biginteger { long long number[26]; int len; biginteger operator+(biginteger &b) { int i,root=max(len,b.len),Len=1; biginteger ans; memset(ans.number,0,sizeof(ans.number)); ans.len=1; for(i=0; i<root||ans.number[i]; i++) { ans.number[i]+=number[i]+b.number[i]; if(ans.number[i]>=mod) { ans.number[i+1]+=ans.number[i]/mod; ans.number[i]%=mod; } if(ans.number[i]) Len=i; } ans.len=Len+1; return ans

自己实现printf函数

匿名 (未验证) 提交于 2019-12-03 00:22:01
首先我们先来了解一下基础知识。 printf 格式字符如下所示, 格式字符 说明 d 以带符号的十进制形式输出整数 ( 整数不输出符号 ) u 以无符号十进制形式输出整数 x 以十六进制无符号形式输出整数 ( 不输出前导符 0x) , 用 x 则输出十六进制数的 a~f 时以小写形式输出 c 以字符形式输出,只输出一个字符 s 输出字符串 在 C 语言中,不仅参数的类型可变,而且参数的个数也是可变的 . 也就是说,在形参表中可以不明确指定传递参数的个数和类型,以上所说的 printf 函数就是如此 . 这种函数称之为变参函数。可变长参数函数的参数数目和类型虽然是可变,但其设计原理与固定参数函数的设计原理是一致的,我们有办法告诉变参函数没有指定的参数的个数和类型。 printf 的声明如下: int printf(const char *format, ...); format: 固定参数 ... : 可变参数 ( 变参 ) 在 C 语言中,变参函数的声明是放在 atdarg.h 标准库中的,当然可以直接包含进来使用它,但我们这里自己定义它(参照头文件的宏定义)。 typedef char * va_list; /* 当sizeof(n)=1/2/4时,_INTSIZEOF(n)=4 */ #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int

memset函数为二维数组初始化

匿名 (未验证) 提交于 2019-12-03 00:22:01
1 int* a; a = new int[10]; sizeof(a) 只会返回出来指针的大小,所以我们只能自己计算这个数组的长度,这里应当是sizeof(int) * 10, 因为数组里面有10个int 所以应该,memset(a, 0, sizeof(int)*10);//将a数组初始化为0 2 int **p;//开一个n*m的数组 p = new int*[n]; for (int i = 0; i < n; i++) { p[i] = new int[m + 1]; memset(p[i], 0, sizeof(int)*m); //p赋初值为0,sizeof一个指针返回的是指针大小,所以还是sizeof(int) } for (int i = 0; i < n; i++)//释放p delete[] p[i]; delete[] p; memset(p, 0, sizeof(int)*m*n);//因为是p相当于一个指向一个一维数组的 指针 ,首先格式就不对 memset(p, 0, sizeof(p)*m*n);//也不对,因为我们要的是真正储存数据的空间,而不是指针 转载请标明出处: memset函数为二维数组初始化 文章来源: memset函数为二维数组初始化

int a[]与int* a的区别

匿名 (未验证) 提交于 2019-12-03 00:21:02
当你凝视深渊的时候,深渊也在凝视你。 作者: zhanghaoli12345@163.com NOTE: 此文档只是个人理解,其中如有错误望可以指正。 指针占用内存空间存储地址;数组名是一个数组起始的位置。指针的指向可以修改,数组在内存中起始位置无法修改。 对指针使用sizeof得到的是4字节(32-bit)和8字节(64-bit),而对数组名使用sizeof得到的是数组的大小。 做为形参的时,int a[]与int *a没有实际作用上的区别。当然,如果你采用a[]作为形参,可以更明显的体现这是一个数组。 第四点还没想起来,想起来再说吧。。。 本胖遇到了一个常见的问题,即需要根据不同的情况构建占用不同大小的存储区域,并格式化。 即存在如下的两个结构体,而其中N的值为不定值; typedef struct _test_a_tag { int32_t a; int16_t b; uint8_t c; } tat; typedef struct _test_b_tag { int16_t num; tat tat[N]; } tbt; 本胖想到的第一个方案是: typedef struct _test_b_tag { int16_t num; tat* tat; } tbt; tbt->tat = malloc(sizeof(N * tat));

CUDA:纹理内存入门到精通--纹理对象

匿名 (未验证) 提交于 2019-12-03 00:20:01
纹理对象是CUDA针对纹理参考缺点而提出的升级版,其作用和纹理参考完全一致,但是使用方法更加灵活。 与纹理参考相比,CUDA对其进行各方面的升级,一方面是可以再代码中申请和销毁,另一方面则可以作为设备函数的参数进行传入;可以满足一些特殊的需求。 使用纹理对象主要包括纹理对象创建、纹理访问和纹理对象销毁。 纹理对象创建之前首先要分别对纹理资源和纹理对象属性进行确定,分别对应cudaResoruceDesc和cudaTextureDesc;然后即可利用cudaCreateTextureObject来创建纹理对象。本文通过代码来解释这个过程: // 纹理资源 struct cudaResourceDesc resDesc ; memset(&resDesc, 0 , sizeof(resDesc)) ; //resType指定对应设备内存的形式,主要包括 //cudaResourceTypeArray(二维纹理内存和二维纹理对象) //cudaResourceTypeMipmappedArray(不常用) //cudaResourceTypeLinear(一维纹理内存和一维纹理对象) //cudaResourceTypePitch2D(一维纹理内存和二维纹理对象) resDesc .resType = cudaResourceTypeArray ; //res是一个枚举变量