C语言编程问题分析,以及错误解决方法

大家新年好呀,过年这段时间太忙了,一直没有写文章,这两天才想起来应该搞搞学习了,就把年前写的atm项目中遇到的一些问题整理出来,供需要的人参考学习,也供自己回顾温习。
6D0A62B3.jpg

void*指针类型

一开始学习C语言时,对void*这个类型没有过多的了解与关注,只知道是“没有类型的指针”,没有用过,在写atm这个项目的时候,才真正去了解它。
6CE4D5E8.gif
void*类型是一个指向未知类型的指针,不能直接用于访问指向的数据。
其实,各种类型之间没有本质的区别,void*也同样,只是解释内存中的数据方式不同,int*指向的内存中存储着数字,char*指向的内存中存储着字符串。如果需要转换为特定的数据类型,需要根据具体的数据类型进行强制类型转换,才能正确的访问和操作数据。但需要注意的是,在进行void*向特定类型的数据转换时,需要确保原始的void*指针指向的内存确实包含了有效的转换指针数据,否则可能会导致未定义行行为。

  • 比如,void*类型转换为char*类型,确保void*转化时指向的内存中存储的就是char类型数据即可。
  • 特定类型的数据也可以转换为void*类型。因为void*是一种通用的指针类型,可以接受任何类型的指针。比如,char*类型转换为void*类型,只需要强制转换,插入类型转换为void*类型不会丢失任何信息,只需要确保在转换之前正确地分配内存。

6CEC040B.jpg
在很多通用的函数接口中,给的都是参数类型都是void*。
比如:void* memcpy(void* dest,const void* src,size_t n);
其中,dest是指向目标内存地址的指针,src是指向源内存地址的指针,n是要被复制的字节数。这个函数返回一个指向目标内存地址的指针。使用memcpy函数可以方便的将一段内存中的数据复制到另一段内存中,而不需要手动逐个字节地复制。
这样设计的目的是,因为你不知道用户的数据类型是什么,但是你必须能够,处理用户的各种数据类型,所以会使用void*,void*能包容的接受各种类型的指针。如果你期望接口能够接受任何类型的参数,你可以使用void*类型,但在具体使用的时候,你必须转换为具体的指针类型。
6CF2C385.jpg
在使用void*需要特别注意的是,你必须清楚原始传入的是什么类型,然后转换成对应的类型。
void*很强大,但是一定要在合适的时候使用;

读取/写入位置发生访问冲突

遇到 C/C++程序运行时提示“读取/写入位置发生访问冲突”。
产生原因:一般都是由于发生异常处的代码中,涉及到数据的读取或写入,并且访问数据时使用的是指针,而该指针并未得到合适的初始化,导致其所指向内存为NULL。
解决方法:

  • 写入冲突:初始化变量;
  • 读取冲突:输出类型写正确;

while循环中有Switch,如何跳出while循环

while循环用boolean变量控制

switch中的break只能终止switch循环,无法终止while循环,如果将break改为return,虽然能终止循环,但是也会用力过猛,整个方法都会终止。
如何做到精确的终止掉当前while循环,我们可以在外面定义一个boolean变量flag来控制while循环,通过改变flag的值来控制while循环。
如下是atm系统中“修改用户信息”函数的部分代码:

//修改用户信息 
void updateInfo(){
	int i=0;
	int flag = 1;
	Customer *user = (Customer*)getData(hashmap,custCurrent->accountCard);
	while(flag){
		scanf("%d",&i);
		switch(i){
		case 1:printf("请输入账户名称:\n");scanf("%s", &user->accountName);break;
		case 2:printf("请输入电话号码:\n");scanf("%s", &user->mobile);break;
		case 3:printf("请输入要修改的密码:\n");scanf("%s", &user->password);break;
		case 0:flag = 0;break;
		default:printf("输入有误,请输入对应的值");
		}
    }
	printf("修改用户信息成功! ");
	return;
}

在修改用户信息函数中,一开始我并没有使用flag变量,导致循环总是出现提前终止或陷入死循环的问题,后面巧妙的使用了一个flag变量去控制循环的终止就可以完美的实现啦。

static关键字

修饰局部变量

使用static修饰的局部变量不会在函数重新进入时再次赋初值,不会在函数结束时而释放(存储在全局区),也不会在循环中多次赋初值。这种变量的作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。使用static修饰的局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

修饰全局变量

使用static修饰的全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者相互不影响。在定义不需要与其他文件共享全局变量时,加上static关键字能够有效地降低程序模块化之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

修饰函数

使用static修饰的函数只能在本文件中调用,不能在其他文件中调用。这种函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。出现在类体外的函数定义不能指定关键字static
6CFE47F2.jpg

ASCII码

image.png

  • 76
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Linux 下编写 C 语言程序需要一个编译器,如 GCC。可以使用命令行工具编写代码,并使用 GCC 编译器编译代码。例如,在命令行输入 "gcc -o programname programname.c" 可以将 programname.c 文件编译为可执行文件 programname。然后在命令行运行 "./programname" 即可运行编译后的程序。 ### 回答2: Linux下C语言编程是非常常见的一种开发环境与方式。Linux操作系统提供了完善的C语言开发工具链,包括编译器、调试工具、开发库等,因此在Linux下进行C语言编程是非常方便和高效的。 首先,Linux下最常用的C语言编译器是GNU编译器套装(GCC)。GCC是一个开源的编译器套件,支持多种编程语言,其包括C语言。使用GCC编译器,可以将C语言代码编译成可执行的机器代码,从而在Linux操作系统上运行。 其次,Linux提供了丰富的调试工具,如GNU调试器(GDB)。GDB是一个功能强大的调试工具,可以通过设置断点、查看变量值、跟踪程序执行流程来帮助开发人员进行代码调试。使用GDB可以快速定位并解决代码错误。 此外,Linux还提供了大量的开发库和工具,如标准C库(libc)、各种系统库和第三方库等。这些库和工具能够极大地提升C语言编程的效率和功能,开发人员可以利用这些库来实现各种功能,如文件操作、网络通信、图形界面等。 在Linux下进行C语言编程还有一个显著的优势就是开源社区的支持。Linux有庞大的开源社区,有着丰富的资源和经验,开发人员可以从获取帮助和学习。在开源社区,开发人员可以共享自己的代码、学习他人的经验,并且可以参与到各种开源项目去,提升自己的技能和知识。 综上所述,Linux下C语言编程是非常强大和便利的。通过Linux提供的工具链、库和开源社区的支持,开发人员可以高效地进行C语言编程,实现各种功能和项目。 ### 回答3: Linux下的C语言编程是一种广泛应用的编程方式。Linux作为一种开源操作系统,在C语言编程方面具有许多优势和特点。 首先,Linux下的C语言编程可以充分利用Linux操作系统的强大功能和丰富的系统接口。通过使用Linux的系统调用接口,我们可以直接对文件、进程、网络等进行操作,实现更高级的功能。同时,Linux提供了许多方便的开发工具和库,比如GCC编译器、C库,使得C语言编程更加方便和高效。 其次,Linux下的C语言编程具有良好的可移植性。由于Linux操作系统的开源性质,C语言编程在Linux下编写的程序可以在其他操作系统上进行移植。这为开发者提供了更大的自由度和灵活性,使得他们能够更好地跨平台开发和移植应用程序。 另外,Linux下的C语言编程也提供了强大的调试和性能优化工具。开发者可以使用诸如gdb、valgrind等工具对C程序进行调试和性能分析,以找出潜在的问题并提高程序的效率。这些工具的存在大大提高了开发者对程序的控制和管理能力。 总结而言,Linux下的C语言编程是一种功能强大、可移植性高且开发工具丰富的编程方式。通过利用Linux操作系统的强大功能和丰富接口,开发者可以编写高效、稳定且可移植的应用程序。这使得Linux下的C语言编程成为了许多开发者的首选。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值