Linux C编程中遇到问题

原创 2015年07月10日 15:01:35

1、memcpy 和 memmove

    功能:拷贝一定长度内存内容到指定的内存;

    区别:当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确;

    函数原型:

    void *memcpy(void *dst, const void *src, size_t count);

    void *memmove(void *dst, const void *src, size_t count);

    图形看出两者的区别:


    第二种体现出两者的区别;


2、sprintf 和 snprintf

功能:格式化的数据写入某个字符串中

原型:

int sprintf( char *buffer, const char *format, [ argument] … );

int snprintf(char *str, size_t size, const char *format,[ argument] … )

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');

(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。

区别:(1sprintf存在内存溢出的问题;

           (2)返回参数不同,看如下测试程序以及输出:

#include <stdio.h>

int main()
{
        int ret_value = 0;
        char buffer[1024] = { 0 };
        const char *str = "1234567890";
        char buff1[1024] = { 0 };
        char buff2[1024] = { 0 };
        int len1 = 0, len2 = 0;
        int i;

        ret_value = sprintf(buffer, "%s", str);
        printf("ret_value = %d\nbuffer = %s\n", ret_value, buffer);
        ret_value = snprintf(buffer, 5, "%s", str);
        printf("ret_value = %d\nbuffer = %s\n", ret_value, buffer);
    
        len1 = snprintf(buff1, 1024, "%s", "a");
        printf("len1 = %d\n buff1 = %s\n", len1, buff1);

        len2 = sprintf(buff2, "%s", "a");
        printf("len2 = %d\n buff2 = %s\n", len2, buff2);    
        for(i = 0; i < 3; i++)
        {   
              snprintf(buff1, 1024, "%s%s", buff1, "a");
              sprintf(buff2, "%s%s", buff2, "a");
        }   
        printf("buff1 = %s\n", buff1);
        printf("buff2 = %s\n", buff2);
        return 0;
}

输出:

 

(3)snprintf每次会将缓存区buffer[0] =’\0’,而sprintf没有这个参数,可以参照glibc标准源码。上面用测试用例验证。

类似:strcpy() sprintf() strcat() 存在安全隐患, 其对应的安全版为:

strncpy() snprintf() strncat()

 

3、指针数组和数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组      

                 表示:数组a中的元素都为int型指针     

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针      

                 表示:指向数组a的指针

                 元素表示:(*a)[i]  

4、for循环中三条语句执行顺序:

     看下面例子,以及汇编代码来查看for循环中的执行顺序:

#include <stdio.h>
int main()
{
        int i;
        for(i = 0; i < 10; i++)
        {
                printf("%d\n", i);
        }
        return 0;
}

编译成汇编:gcc -S for_test.c

查看汇编代码:

.file   "for_test.c"
        .section        .rodata
.LC0:
        .string "%d\n"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $32, %esp
        movl    $0, 28(%esp)
        jmp     .L2
.L3:
        movl    $.LC0, %eax
        movl    28(%esp), %edx
        movl    %edx, 4(%esp)
        movl    %eax, (%esp)
        call    printf
        addl    $1, 28(%esp)
.L2:
        cmpl    $9, 28(%esp)
        jle     .L3
        movl    $0, %eax
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
        .section        .note.GNU-stack,"",@progbits

很清晰的看到,

先对整数赋值,条件判断,for体执行,变量递增。






linux下C语言编程操作MySQL数据库

在实际应用中,我们不可能在命令行登录进数据库进行数据的查询、插入等操作,用户一般是使用一个界面良好的应用程序软件来对数据进行管理。为了方便应用程序的开发,MySQL提供了多种编程语言(C、perl、p...
  • qq_21111579
  • qq_21111579
  • 2016年07月28日 09:55
  • 4126

linux下C编程(六)之 void用法大总结

这次对void差不多有点多少的理解了,从最初的理解就是空,么有的意思。首先void是C语言中的关键字,对函数返回值的限定,对函数参数的限定。 1.void*常常被称为空指针,其实理解为指向任意类型的...
  • lotluck
  • lotluck
  • 2015年10月25日 21:39
  • 1367

Linux下简单的c编程——选择法排序

针对函数和数组的C语言的学习,我今天来写一个比较典型的数组和函数的结合的例子——选择法排序 选择法顾名思义,先选择最大和最小的数,然后再进行排序 第一步首先附上我的代码。第一段代码是实现从大到小排序,...
  • goodman_lqifei
  • goodman_lqifei
  • 2016年09月28日 21:11
  • 245

如何用linux系统编写c程序

目录 [TOC]为什么要写这一篇博客因大一上学期老师要求而开始使用linux系统编写c程序,而linux编写的模式与windows差别很大,所以写此文章记录自己的学习历程,也能为初学者提供帮助 (本...
  • qq_36328643
  • qq_36328643
  • 2016年10月12日 10:28
  • 3945

Linux C OSS音频编程

在linux下也可以写一个类似麦克风和喇叭这样的应用程序,只要打开/dev/dsp这个设备驱动,对该设备read读操作相当于录音,对这个设备write写操作相当于放音。对于以下出现的一些参数我就不多说...
  • morixinguan
  • morixinguan
  • 2016年07月06日 14:05
  • 1832

程序员遇到问题时怎么办

技术区: 程序员遇到问题时怎么办: 根本的指导方针 1.首先写代码的时候最好不要有缺陷。最好的修复方法就是让bug胎死腹中。 良好的单元测试强制数据库约束使用输入验证框架避免未...
  • lijia791541916
  • lijia791541916
  • 2016年06月23日 13:19
  • 2017

JSP编程中遇到问题

1)  EXTjs的应用。 2)  关于文件上传解决方法: 1、  提交form文件上传,新增一个空白iframe在form中可保证提交表单后不刷新页面 2、  采用jQuery.form.js...
  • weixin_36358043
  • weixin_36358043
  • 2017年01月17日 15:05
  • 48

Linux C编程从初学到精通

华清远见系列图书Linux C编程从初学到精通华清远见嵌入式培训中心  张繁  等编著ISBN 978-7-121-12804-22011年4月出版定价:69.00元(含DVD光盘1张)16开548页...
  • broadview
  • broadview
  • 2011年05月03日 09:44
  • 6425

尝试linux下c编程之管道

今天试了下管道,感觉挺有意思的~ 现在才发现,原来进程也有这么多的功能可以实现。管道分类: 根据进程的相互关系,可以分为:匿名管道与命名管道。1   匿名管道:管道是父进程和子进程间,或是子进程与子进...
  • wencool
  • wencool
  • 2008年04月12日 22:44
  • 5621

linux下C时间编程(1)——时间显示与转换

时间显示:   本文将着重阐述在linux下C开发中实际应用的时间编程的一些方法和技巧,对一些原理性的东西并不进行深入的讨论,如果读者有更深刻的理解,欢迎加入讨论。   在实际C开发中,我们常常需...
  • u011192270
  • u011192270
  • 2014年12月14日 14:54
  • 1795
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux C编程中遇到问题
举报原因:
原因补充:

(最多只允许输入30个字)