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编程 第13章进程间通信方式十个问题及解答(2)

Linux C编程 第13章进程间通信方式十个问题及解答(2)   1.信号种类怎么分类?   可以从两个不同的分类的角度对信号进行分类: 可靠性方面,分为可靠信号与不可靠信号;  与时间的...
  • ai_keke
  • ai_keke
  • 2017年11月30日 21:33
  • 12

Linux C 第十五章通信网络编程十个问题及解答(1)

Linux C 第十五章通信网络编程十个问题及解答(1)   1. 简述TCP/IP协议   TCP/IP是网络中使用的基本通信协议,TCP/IP实际上是一组协议,它包括上百个能完成各种功能的协...
  • ai_keke
  • ai_keke
  • 2017年12月06日 22:30
  • 7

Linux C 第十五章网络编程十个问题及解答(2)

Linux C 第十五章网络编程十个问题及解答(2)   1.什么是大端模式,什么是小端模式?   内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫做小端模式;   内存的高地...
  • ai_keke
  • ai_keke
  • 2017年12月06日 22:32
  • 3

Linux C编程连载【5】- 关于双链表“掉链子”的问题

【问题】用双链表实现贪吃蛇时,用gcc编译后,执行发生段错误。用gdb调试发现错误位于删除操作,后检查发现真正的原因出在插入操作。如题所示,双链表掉链子了,没接上。 【分析】 如图1所示,...

Linux C第十二章进程控制编程十个问题及解答

Linux C第十二章进程控制编程十个问题及解答   1.什么是进程?什么是并发技术?   进程是可并发执行的程序,是在一个数据集合上的运营过程。   并发技术,就是可以让你在同一时间同时执行...
  • ai_keke
  • ai_keke
  • 2017年11月23日 22:05
  • 16

自学Linux C时遇到的多线程问题

学习多线程时关于遇到问题自己的猜想,不知道对不对,请多指正。 先来看一段代码,就是著名的生产者消费者问题。 #include #include char store[5]; int g_...

《Linux C程序设计大全》中遇到滴一个小问题

     在《Linux C程序设计大全》——第十四章的进程间通信的——14.2.3的匿名半双工管道的读写操作这一小节中有这样的一段话:“如果要建立一个父进程到子进程的数据通道,可以先调用pipe函数...

C嵌入PyThon遇到问题解决方法

使用源代码的方式安装Python2.7之后,在import某些库时抛出了如下异常: ImportError: libpython2.7.so.1.0: cannot open shared obje...

C/C++ 面试前 遇到问题总结

《钱能的书》18.7 赋值运算符 拷贝构造函数和赋值运算符的区别: 当拷贝构造函数执行时,newMC对象还不存在,拷贝构造函数起初始化作用。 当赋值运算符在newMC上执行时,它已经是一个MyC...

黑马程序员_编程新手遇到问题怎么办?

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 在黑马论坛中遇到一些比较有趣的题目,涉及到各种知识点。现在进行一下简要的归纳...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux C编程中遇到问题
举报原因:
原因补充:

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