C/C++
信号处理学渣
这个作者很懒,什么都没留下…
展开
-
C语言宏定义问题
C语言中,在定义数组时,因为数组长度需要是常量或者宏,尝试将变量按照值不同定义同一个宏的不同值,然后用宏来定义数组长度,结果发现不行。原创 2024-03-15 17:57:16 · 319 阅读 · 0 评论 -
C语言中,可以在子函数中动态申请一个指向二维数组的内存给调用函数使用么——看ChatGPT的回答——
这个行数组中每个元素,是指针!是的,可以在子函数中动态申请一个指向二维数组的内存,然后将其传递给调用函数使用。即先定义一个指向一维数组(可以当成行数组)的指针,即每个指针指向的是行数组,然后——关键的来了——C语言中,可以在子函数中动态申请一个指向二维数组的内存给调用函数使用么。下面是ChatGPT的回答,太专业了,比网上查的资料都好很多可能。之前还以为不行,只能以一维数组的形式返回呢。或者类似文中主函数调用赋值时写法,写成:p[i][j]原创 2024-03-15 17:31:56 · 366 阅读 · 0 评论 -
二级指针作为函数参数——可以改变调用函数中传入指针的值(不是指向地址的值哦!)
对里面的程序进行一些修改和补充,调试加更多说明。原创 2024-03-12 15:27:58 · 361 阅读 · 0 评论 -
数组与指针之二——二级指针之一
这里用了两个&号,表示取两次地址,含义 上是没错的,这报错,是C语法的问题,是将前面一个&当成与操作,所以需要左值是变量或者函数调用形式,而右边只有括号里的&是真取了地址,所以报C2440,无法从int*转换为int**。可见,虽然&a是指向指针的指针,但如第一篇所述,它确是指向4个元素数组的指针,也就是指向一个行数组的首个元素,是有限制的,类型是int (*)[4],并不表示是指向一个int变量的地址,即int **。所以,重点来了,对于一维数组,这种二级指针其实是多此一举了,那么对于二维数组呢?原创 2024-03-08 10:56:16 · 293 阅读 · 0 评论 -
数组与指针之一
从数组与指针组合来看。原创 2024-03-07 19:55:10 · 836 阅读 · 0 评论 -
VS的__int64和linux的long long
个人理解,__int64是windows系统用,且VC6.0还不能用,且32为系统还不安全。long long是linux编译器g++ gcc等用的,其实是C99的标准。不知道对不,改天可以用g++编译器编译下定义为_int64的变量看看。原创 2024-02-27 16:08:59 · 333 阅读 · 0 评论 -
linux调用so库之一
可以看他的第一部分,即显式调用。但是会报错,我的版本是64位的Ubuntu 20.04.6 LTS。会发现直接用第一种方式的代码报错,dlopen函数返回是void *型指针,不能匹配原so库中调用函数的函数指针类型。这种是可以调用成功的,直接编译调用程序,生成.out文件执行即可。需要注意的是,dlopen函数打开so库时的路径需要设置为绝对路径。即定义一个函数指针类型,然后调用dlsym函数强制转换此类型。原创 2024-02-21 18:28:28 · 451 阅读 · 0 评论 -
windows系统用VS环境开发linux程序之一
按照文中所述,确实在本地和远程都有一样的文件夹。本地直接在VS中运行,即打开shell输出打印。在远程虚拟linux系统,则是进入到对应的文件夹,一般是projects,运行./***.out即可打印输出。正常是先建立linux工程,然后再设置连接虚拟linux系统。如果是要编译自己写的程序,则可以建linux空工程。主要有两种方法,一种是在windows中安装linux子系统,即WSL,另一种是windows系统装linux虚拟机。测试过可以设置自动连接,貌似也可以连上本地windows主机的网卡。原创 2024-02-21 16:59:10 · 456 阅读 · 0 评论 -
C/C++数组定义时长度之可以用变量么
这个参考资料是百度知道,居然质量还挺好。不管是C还是C++,其实都是动态申请内存,不影响使用,但是要注意释放。也明确说了VS是不可以的。貌似和编译器有关,有些编译器支持变量定义数组长度的。原创 2024-02-02 14:56:52 · 364 阅读 · 0 评论 -
C内存对齐问题
其中关于内存对齐,讲了结构体以及位域,以及一些容易出错的地方,非常好。下面提到的对齐模数就是上面提到的有效对齐值N。注意,这里讲位域只能用在结构体或联合体中。注意位域对齐,既要考虑自身字节存储时需不需要填充位,又要考虑整体作为结构体存储时需不需要填充字节。原创 2024-01-19 15:27:09 · 527 阅读 · 0 评论 -
联合体中嵌套结构体,结构体未命名时,结构体成员变量的引用
联合体名.结构体成员变量名。也可以给结构体命名,则使用。联合体.结构体.成员变量名。原创 2024-01-18 18:04:11 · 413 阅读 · 0 评论 -
指针取值运算符*和++运算符的优先级
可见此时p的值没变,还是指向数组第一个元素,值为1。在实际组合时,是看哪个和变量结合近,就优先执行哪个。具体说,*和++是同等优先级,是对的。先取值,再地址加1。将p又指向第一个元素,略。写的不详细,或者有不对。原创 2024-01-18 16:56:43 · 485 阅读 · 0 评论 -
C语言位域定义与使用
字节的高位低位,是按照从左到右顺序,取各位操作时,先按照字节顺序,先取低字节再取高字节,即是反过来取的。而在每个字节内部,又是先取低位再取高位,也是反过来的。但是,在取完后放置时,却是需要再反一下,即先取的放高位,后取的放低位,即高低位翻转了!其实也是因为先取的是原数据的低位,后取的是高位,所以放的时候,也是从右往左放,所以最终结果是高低位和取的顺序是反的。b2是第一个字节的第7位到第5位,即0 1 1,但是结果却是110,即6。b3是第二个字节的低4位,即1 0 1 1,结果却是1101,即13。原创 2024-01-18 15:33:24 · 425 阅读 · 0 评论 -
VS生成C++动态链接库DLL
VS生成C或C++的DLL原创 2024-01-18 11:41:12 · 1061 阅读 · 0 评论 -
VS报错:error:LNK2005 _main 已经在 *.obj 中定义
实际上,多年以来一直有个问题困扰我很久,总弄不明白,就是一般一个头文件对应一个源文件,但是,一些数据类型、宏定义等,在头文件中定义,在源文件中使用,同时,在其他文件也要使用,那么源文件必须嵌入这个头文件,其他文件也需要嵌入这个头文件。然后,一些变量,在源文件中定义,别的源文件需要使用,则,就需要在头文件中声明。这些变量,是在源文件中定义的,在头文件声明,其他源文件只需要嵌入头文件,即可使用。其实,这些数据类型和宏,完全可以在源文件定义,然后在头文件再声明,和变量、函数是一样的处理。试运行程序,没有问题。原创 2024-01-13 10:19:09 · 530 阅读 · 0 评论 -
C语言:高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序
和另外一篇栈的生长、存放顺序一样,一般描述栈的方向是相反的,即栈底在下,栈顶在上。注意大小端存储方式,简单讲小端是低字节低地址,高字节高地址,是顺的,大端是反的。另外,先后声明的变量,是先定义的存高地址,后定义的存低地址。数组,前面元素存低地址,后面高地址,也就是按地址增加存的。类、结构体的元素类似。原创 2024-01-11 10:22:26 · 427 阅读 · 0 评论 -
typedef函数指针
然后,其实很多类似的用法,有种说法是用typedef抑制伪劣代码,哈哈。原来是加了typedef是变成了类型定义!原创 2024-01-11 10:04:43 · 359 阅读 · 0 评论 -
C语言堆栈地址定义
那么出栈方向是低地址向高地址,即,栈顶指针需要不断加,才能实现出栈(很多程序涉及到栈指针)但是高地址低地址是不变的,即栈底是高地址,栈顶是低地址,即栈增长方向是高地址向低地址。堆地址反过来,增长方向是从低地址向高地址。如果释放地址,则先释放高地址,再释放低地址。文章讲的很明白,但是一般,我们习惯栈底在下面,栈顶在上面,即和文章中反过来。原创 2024-01-10 14:46:03 · 379 阅读 · 0 评论 -
C读dat文件
c语言怎么读取dat数据 - 问答 - 亿速云 (yisu.com)c语言如何读取.dat文件-C语言-E安全 (easyaq.com)原创 2024-01-10 09:18:33 · 345 阅读 · 0 评论 -
C和C++代码混编时出现找不到C代码函数定义的问题
主函数是cpp文件,其他文件都是c文件,所以有上面题目。编译时,只要C++代码调用C代码就出现找不到函数定义问题。另一种解决办法是,将所有C源文件改为CPP文件。尝试将所有C头文件都在首尾加了。上面这篇文章讲得很明白了。原创 2024-01-10 09:16:12 · 442 阅读 · 0 评论 -
C静态修饰词static
注意静态变量和静态函数。原创 2024-01-09 17:34:42 · 371 阅读 · 0 评论 -
C语言共用体(C语言union用法)详解
知识性及例子,这篇足够。主要是,什么样的情况适合用联合体。1、一个变量可能取不同的数据类型,可以使用。原创 2024-01-04 14:56:45 · 389 阅读 · 0 评论 -
C语言深拷贝和浅拷贝问题
所以这在释放内存时会出问题,会导致原来拷贝结构体指针指向的动态内存没有指针指向它,也基本就无法释放了,后面如果涉及动态内存申请和释放,程序会报错。这里结构体里面的指针是指向了动态分配内存。其实就算是指向任何一个变量或者数组,拷贝结构体时都是浅拷贝,即,拷贝结构体的指针本身(值)被拷贝,也就是其指向被拷贝结构体指针指向的值,而不指向原来指向的值,原来指向的值就和这个指针脱离了。有些地方用结构体赋值代替memcpy结构体,结果是一样的,但是,个人认为,赋值不叫拷贝,应该就叫赋值,否则浅拷贝情况太多了。原创 2023-12-21 17:33:17 · 914 阅读 · 0 评论 -
C语言IIR双向滤波
设计一个通用的双向滤波程序,包括滤波函数和数组逆序函数,包含可以和matlab对数据的写数据代码。设计一个0.5~1Hz的IIR滤波器,用巴特沃斯或者契比雪夫2,看零极点图是稳定的。可以得到滤波器系数a,b.原创 2023-11-29 15:48:57 · 502 阅读 · 0 评论 -
C语言 子函数调malloc申请内存返回给主函数使用——可行,但要注意!——修改、完全篇
一般情况,子函数中动态申请内存,将地址返回给主函数,理论上应该也是可以的,需要子函数返回动态内存地址,主函数实参是相应的地址变量即可。需要注意的是,需要传入二级指针,也就是主函数实参是指向地址变量的指针。那么实参即指向子函数内动态申请的内存,调用完后,需要释放内存,即释放实参即可。原创 2023-11-21 19:55:26 · 532 阅读 · 0 评论 -
C++堆内存错误:CRT detected that the application wrote to memory before start of heap buffer
C运行时出现这个错误,不会暂停到出错点,而是直接崩了。经检查,是free一个动态内存的指针出错。在写数据时,写到分配的动态内存地址以外,写的时候并不报错,但是在释放的时候就报这个错误。堆内存错误:应用程序在堆内存前写入了数据。堆是低地址到高地址写,反正前后都不能由应用程序写。暂时只碰到这个错误导致,应该还有其他情况也会报这个错。原创 2023-11-18 10:23:44 · 162 阅读 · 0 评论 -
C/C+ 内存管理疑问
问题是,这个0x0804 8000 到0xC 0000 0000之间,不止3GB,应该有47GB,该怎么解释呢?原创 2023-11-17 09:07:32 · 108 阅读 · 0 评论 -
C语言:CRT detected that the application wrote to memory after end of heap buffer
检测到了堆内存被破坏,程序向堆内存前面的内存区域写入了内容。需要检查数组,特别是动态内存数组的访问和写入。即指针释放位置错误。应该是因为释放到系统内存区了。原创 2023-11-10 11:14:41 · 749 阅读 · 0 评论 -
C语言 exit函数
需要注意的是,在程序中使用exit函数会立即强制结束程序,程序内部未处理的任何资源都将不能释放,也就可能导致内存泄漏。因此,在使用exit函数之前,需要先释放内存、关闭文件等操作。原创 2023-11-09 20:08:25 · 228 阅读 · 0 评论 -
解决VS编译报错C4996 ‘fopen‘: This function or variable may be unsafe. Consider using fopen_s instead...
添加这个宏即可。原创 2023-11-09 19:19:25 · 140 阅读 · 0 评论 -
C语言 判断函数输入参数的个数
其实我是想在任意一个函数开始处就检测输入参数个数,想着和MATLAB一样可以缺省输入参数。比如一个函数可以有5个输入参数,前两个是必须的,后3个都可以缺省,缺省时会自动设置值。int main(int argc,char** argv) // char** argv也可以写成*argv[]但是貌似C语言中无此机制。原创 2023-11-09 10:14:46 · 225 阅读 · 0 评论 -
C语言perror
/ 假设当前路径无此文件。所以,第一个错误是自己强行报错,则只会打印输入字符串open,后面再说明系统无错误,即:No error。第二个perror才是真的打印出系统错误,即找不到文件。在自定义字符串后再打印出系统错误信息。用户自己强加的打印字符串,只会打印字符串,而不是在后面接错误信息。//结果:open:No such file or directory。主要是系统错误时才会打印错误信息。而不是用户自己定义报错就打印错误信息。原创 2023-11-09 10:06:34 · 101 阅读 · 0 评论 -
231108 C语言memset当第三个参数为0,即设置个数为零也不报错
if (sig_buf == NULL) {//判空。犹豫第三个参数为0会不会报错,测试不会。原创 2023-11-08 20:30:39 · 116 阅读 · 0 评论 -
C语言 memset
注意是按照字节赋值的。int型变量,当赋值0时,是没有问题的,但是赋值1,却按照每个字节都赋值1,最终结果错误。或者,用了memset后再将高字节置零?不能使用memset么?所以单独用memset是不行的?原创 2023-11-08 18:15:55 · 94 阅读 · 0 评论 -
C语言字符串传入函数判断
用于⽐较str1和str2中的元素,如果相等就继续往后⽐较,如果提前发现不一样,就提前结束,第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字,第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字,num个字符都相等,就是相等返回0.函数原型:int strncmp ( const char * str1, const char * str2, size_t num );版权声明:本文为CSDN博主「故城山茶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原创 2023-11-08 16:59:25 · 57 阅读 · 0 评论 -
C语言 fread()与fwrite()函数说明与示例
原文链接:http://www.cnblogs.com/xudong-bupt/p/3478297.html1.作用 读写文件数据块。2.函数原型 (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 其中,ptr:指向保存结果的指针;size:每个转载 2017-09-28 14:21:52 · 173 阅读 · 0 评论