• Some good questions


    (一)
    #include <stdio.h>

    #include <stdlib.h>
    void getmemory(char *p)
    {
    p=(char *) malloc(100);
    strcpy(p,"hello world");
    }
    int main( )
    {
    char *str=NULL;
    getmemory(str);
    printf("%s/n",str);
    free(str);
    return 0;
    }
    程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。
    上面代码传str的值进去带不出来,如果对指针进行赋值一定要用更高一级的指针,否则就要有返回值malloc()分配了新的内存给p,但是原来函数中的p是复制了str的值进行操作,函数执行完之后p就找不到了,str并没有得到p的值,同时把p丢了,也没有办法回收分配给p的内存。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    void getmemory(char **p) //双重指针
    {
    *p=(char *) malloc(100);
    strcpy(*p,"hello world");
    }
    int main( )
    {
    char *str=NULL;
    getmemory(&str); //传地址
    printf("%s ",str);
    free(str);
    return 0;
    }

    或者:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    char* getmemory(char *p) //返回char*
    {
    p=(char *) malloc(100);
    strcpy(p,"hello world");
    return p; //返回值
    }
    int main( )
    {
    char *str=NULL;
    str=getmemory(str);
    printf("%s ",str);
    free(str);
    return 0;
    }

    (二)
    char szstr[10];
    strcpy(szstr,"0123456789");
    产生什么结果?为什么?
    答案:长度不一样,会造成非法的OS

    C规定:每一个字符串常量的结尾加一个“字符串结束标志”,以便系统判断字符串是否结束,C规定以''作为字符串结束标志。
    
    
    如果有一个字符串常量char *str = "CHINA",实际上内存中是 C H I N A ,它占内存单元不是5个字符,而是6个字符,最后一个字符为,但在输入时不输出.
    
    
    另外,如果用strlen(str)算大小的话,结果等于5,因为strlen遇就结束。但是stcpy复制时却连一起复制过去,所以会造成非法的OS.
    
    

    源码实现:

    int strlen(const char* str)
    {
        int i=0;
        while(*str++ !=’’)  i++;
        return i;
    }

    char* strcpy(char * dst, const char * src)

    {

        char * cp = dst;

        while( *cp++ = *src++ )

        ;

        return( dst );

    }

    或者

    char *strcpy(char *dest, const char *src)

    {

         unsigned i;

         for (i=0; src[i] != ''; ++i)

             dest[i] = src[i];

         dest[i] = '';

         return dest;

    }

    (三)

    struct name1{             //字节对齐问题
    char str; //sizeof(char)为1
    short x; //sizeof(short)为2
    int num; //sizeof(int)为4
    }; //以4字节对齐,前面2个在第一个4字节里面,所以就是4+4了
    struct name2{
    char str;
    int num;
    short x;
    }; //同样以4字节对齐,这里的char和short分开了,4+4+4了
    为什么sizeof(name1)=8;sizeof(name2)=12
    问题补充:
    类似的
    struct s1{
    int i:8; //因为int占了4字节,
    int i:4; //和上面的一起在了4个字节
    int a:3; //4字节
    double b; //sizeof(double)为8,以8字节对齐,前面的2个合一起为8,所以8+8
    };//16
    struct s2{
    int i:8;
    int i:4; //2个合一起4字节。
    double b; //以8字节对齐
    int a:3;
    };//24 //8+8+8
    (*)    int i:8 ;和int i;有区别,int i:8这个是意思是占32位(4字节)中的8位,int i这个要占满4个字节。
  • 相关阅读:
    PY个树状数组
    PY 个板子计划【雾
    PY个欧拉筛
    【NOI2007】项链工厂 ——老题新做.jpg
    Min-Max 容斥的证明
    51nod 1963 树上Nim
    ●BZOJ 3566 [SHOI2014]概率充电器
    ●BZOJ 3640 JC的小苹果
    ●BZOJ 1444 [Jsoi2009]有趣的游戏
    ●Joyoi Dotp 驱逐猪猡
  • 原文地址:https://www.cnblogs.com/try-again/p/4304468.html
Copyright © 2020-2023  润新知