linux strcpy 用法,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...
今天在写父子进程用两个单向管道通信时,出现了错误:
Segmentation fault (core dumped)
打开core文件发现:
附上源码:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7
8 void erreur(const char *msg)9 {10 perror(msg);11 }12
13 #define NBCAR 256
14
15 int main(void)16 {17 pid_t pid;18 int tube[2];19 int tube2[2];20 intret_out, ret_in;21 char *buffer,*buffer2;22
23 if (pipe(tube) == -1) {//from parent to son
24 erreur("Erreur de creation du pipe");25 exit(EXIT_FAILURE);26 }27 if (pipe(tube2) == -1) {//from son to parent
28 erreur("Erreur de creation du pipe");29 exit(EXIT_FAILURE);30 }31 buffer = (char *) malloc(NBCAR * sizeof(char));32 buffer2 = (char *) malloc(NBCAR * sizeof(char));33 switch (pid =fork()) {34 case (pid_t) -1:35 erreur("fork");36 case (pid_t) 0:37 close(tube[1]);38 close(tube2[0]);39 if (printf("Je suis le fils de PID %d\n write dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer, ret_in =write(tube2[1], buffer="tube1 s to p", NBCAR - 1)) == -1) {40 erreur("Pb Lecture");41 exit(EXIT_FAILURE);42 }43 if (printf("Je suis le fils de PID %d\n Lecture dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer2, ret_in =read(tube[0], buffer2, NBCAR - 1)) == -1) {44 erreur("Pb Lecture");45 exit(EXIT_FAILURE);46 }47
48 exit(0);49 break;50 default:51 close(tube[0]);52 close(tube2[1]);53 if (printf("Je suis le parent de PID %d\n Lecture dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer, ret_in =read(tube2[0], buffer, NBCAR - 1)) == -1) {54 erreur("Pb Lecture");55 exit(EXIT_FAILURE);}56 if (printf("Je suis le parent de PID %d\n write dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer2, ret_in =write(tube[1], buffer2="tube2 p to s", NBCAR - 1)) == -1) {57 erreur("Pb Lecture");58 exit(EXIT_FAILURE);}59
60 wait(NULL);61 break;62
63 }64 free(buffer);65 free(buffer2);66 returnEXIT_SUCCESS;67 }
关于SIGSEGV错误
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:
1.buffer overflow --- usually caused by a pointer reference out of range.
2.stack overflow --- please keep in mind that the default stack size is 8192K.
3.illegal file access --- file operations are forbidden on our judge system.
后来通过邮件问老师,发现是buffer出现内存泄漏。
先梳理一下C语言中char和字符型、字符串型、单引号、双引号、字符串截止符号的概念:
首先C中没有专门的字符串变量(没有C++中的String类),单个的char就代表一个字符,赋值时应该是:char c = 'a'; 故而单引号表示单个字符。如果用char表示字符串,需要定义char的数组,并有两种主要赋值方法:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};char greeting[] = "Hello";//第二例子
char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};char c[]="I am happy";
第一种方法:若初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'\0')。
第二种方法:编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。
回过头看代码中对buffer的操作:
对buffer和buffer2都分配了256个字节的空间(注意他们是指针,指向256个字节连续空间的首地址),但在赋值时直接对buffer使用等号=,把常量字符串赋给一个指针本身,这显然是不对的····原来分配的两块256字节的内存现在没有指针指向了,最后free的时候并不能把他们释放掉,因此造成内存泄漏
但write()和read()中间参数又必须是指针,这时就需要strcpy()函数,改成:
buffer=strcpy(buffer,"tube1 s to p")
buffer2=strcpy(buffer2,"tube2 p to s")
完美运行,不会报错
借此机会再复习一下char字符串用等号=赋值和用strcpy()赋值的区别:
等号赋值,两个char指向同一个空间
函数赋值,两个char各有一个相同的字符串拷贝
本文完
参考:
SIGSEGV错误
关于core dumped
linux strcpy 用法,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...相关推荐
- c语言中管道符作用,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...
今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...
- c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...
- 在c语言中 char型数据在内存中的存储形式是,在c语言中char型数据在内存中的存储形式是什么?...
在c语言中char型数据在内存中的存储形式是ASCII码.在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单 ...
- c语言中 char怎样用,C语言中char*和char[]用法区别分析
C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...
- C语言中char*和char[]用法区别分析
本文实例分析了C语言中char * 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指 ...
- C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加s ...
- c语言控制字符的作用是什么意思,c语言中char的用法是什么意思
C语言是计算机软件领域非常经典的编程语言,C语言中char的作用有哪些你了解吗.下面学习啦小编就跟你们详细介绍下c语言中char的用法,希望对你们有用. c语言中char的用法:c语言中char的用法 ...
- Go 语言中 switch 类型断言用法
Author mogd 2022-05-09 Update mogd 2022-05-09 Adage Don't live in the past. 目录 Go 语言中 switch 类型断言的用法 ...
- 在c语言中char型数据在内存中的储存形式为什么
在c语言中char型数据在内存中的储存形式为"ASCII码".在C语言中,将一个字符常量放到一个字符变量中,实际并不是把该字符本身放到内存单元中,而是将与该字符相对应的ASCII码 ...
最新文章
- DFT - Introduction to Test Models
- 用c语言编程矩阵乘法,c语言矩阵相乘
- python列表间隔合并_Python使用zip合并相邻列表项的方法示例
- userscript.user.js 文件头
- 2011年计算机一级考试题,2011年计算机一级考试试题及答案
- Java类、实例的初始化顺序
- LeetCode刷题(36)--Text Justification
- Tkinter Frame size
- Farthest sampling on 3d mesh with mesh kept
- php 按行读取并分割字符串
- YDOOK:Maxwell 电磁场仿真 最新版的 Maxwell 软件 使用什么软件进行电磁场仿真
- 银行固定资产管理系统盘点方案
- comsol学习中心:建模工作流程
- eureka服务下架、服务续期及eureka源码分析
- vb.net打砖块游戏
- 商业需求响应管理系统行业调研报告 - 市场现状分析与发展前景预测
- 如何从Lytro 相机中获取图像阵列
- 深圳学区房购买-查查吧深圳学区房地图
- 搭建SNS游戏服务器
- 博客搬家 pjblog 到 z-blog