zoukankan      html  css  js  c++  java
  • c语言字串指针 char*

    c语言中 char* 不仅能存字符串,还能存二进制数据,所以它的用途因使用者而定。

    char* 在很多使用场景下,是需要存储ascii码为0的元素的,这样就必须注意一个问题,那就是char*的长度。

    c语言中是没有办法检测char*长度的,这样也就能解释之前为什么我在网上找到的那么多示例函数都把长度信息从函数参数里带进带出了。

    比如这几天在做 rsa 加密、解密时就遇到了一会解密正常,一会儿不正常的情形,感觉像是指针漂移。

    对于我这个写了多年vb、c#的程序员,还真是一头雾水,今天终于搞清楚了。

    之前一直对这个数据类型不清楚,专门写了一个示例程序,以备忘。示例中的 sizeof 只有部分编译器支持,其实不是通用的。

    代码如下:

        char* p = (char*)malloc(8);
        int i = 0;
        for (i = 0; i < 8; i++)
            if (i == 5)
                p[i] = 0;
            else
                p[i] = 'a' + i;
    
        cout << "strlen(p):" << strlen(p) << endl;
        cout << "sizeof(p):" << sizeof(p) << endl;
    
        cout << "p:" << p << endl;
    
        for (i = 0; i < 8; i++)
            printf("%d:%c	", i, (p[i] == 0 ? '_' : p[i]));
        
        cout << "
    before free:" << endl;
    
        for (i = 0; i < 8; i++)
            cout << i << ":" << (p[i] == 0 ? '_' : p[i]) << endl;
    
        free(p);
    
        cout << "after free:" << endl;
    
        for (i = 0; i < 8; i++)
            cout << i << ":" << (p[i] == 0 ? '_' : p[i]) << endl;

    程序输出如下:

    strlen(p):5
    sizeof(p):8
    p:abcde
    0:a    1:b    2:c    3:d    4:e    5:_    6:g    7:h    
    before free:
    0:a
    1:b
    2:c
    3:d
    4:e
    5:_
    6:g
    7:h
    after free:
    0:_
    1:_
    2:_
    3:_
    4:_
    5:_
    6:_
    7:_
  • 相关阅读:
    arm-linux-3.4.2移植for2440
    编译内核是出现:arch/arm/mm/tlb-v4wbi.S:64:error: too many positional arguments
    poj3050 Hopscotch
    poj3187 Backward Digit Sums
    poj2718 Smallest Difference
    hihocoder offer收割编程练习赛10 C 区间价值
    poj1862 Stripies
    poj3262 Protecting the Flowers
    poj2229 Sumsets
    poj2385 Apple Catching
  • 原文地址:https://www.cnblogs.com/nanfei/p/11923523.html
Copyright © 2011-2022 走看看