美文网首页散文简友广场想法
C语言第13周作业(malloc函数,动态分配数组)

C语言第13周作业(malloc函数,动态分配数组)

作者: Cache_wood | 来源:发表于2020-12-12 00:08 被阅读0次

    1.

    1.
    #include <stdio.h>
    #include <stdlib.h>
    
    char *my_malloc(int);
    
    int main(){
        int n;
        printf("enter a number:");
        scanf("%d",&n);
    
        puts(my_malloc(n));
        free(my_malloc(n));
        return 0;
    }
    char *my_malloc(int n){
        char *p = malloc(n+1);
        if(p==NULL){
            printf("error!");
            return NULL;
        }
        return p;
    }
    
    2.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *duplicate(const char*);
    
    int main(){
        printf("enter a string:");
        char s[100];
        gets(s);
        puts(duplicate(s));
        free(duplicate(s));
    
        return 0;
    }
    char *duplicate(const char *s){
        char *temp = malloc(strlen(s)+1);
    
        if(temp==NULL)
            return NULL;
        strcpy(temp,s);
        return temp;
    }
    
    3.
    #include <stdio.h>
    #include <stdlib.h>
    
    int *create_array(int,int);
    
    int main(){
        int n,initial_value;
        printf("enter two numbers:");
        scanf("%d %d",&n,&initial_value);
    
        int *s = create_array(n,initial_value);
        for(int i=0;i<n*sizeof(int);i++){
            printf("%d\n",*s);
            s++;
        }
        free(s);
        
        return 0;
    }
    int *create_array(int n,int initial_value){
        int *p = malloc(n*sizeof(int));
        if(p==NULL)
            return NULL;
        for(int i=0;i<n*sizeof(int);i++){
            p[i] = initial_value;
        }
        return p;
    }
    

    2.

    版本1

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    //版本1:
    void get_mem(char *p)
    {
        p = (char *)malloc(100);
    }
    int main(void)
    {
        char *str = NULL;
        get_mem(str);
        strcpy(str, "hello world");
        printf(str);
    }
    

    对str初始化为空指针,但是传入get_mem()函数时是str的副本,在离开get_mem()函数时作用域消失,所以str仍然是空指针,而且没有分配空间,所以并不能打印出结果。

    版本2

    #include <stdio.h>
    //#include <string.h>
    #include <stdlib.h>
    //版本2:
    char *get_mem(void)
    {
        char p[] = "hello world";
        return p;
    }
    int main(void)
    {
        char*str = NULL;
        str = get_mem();
        printf(str);
    }
    
    
    version.c: In function 'get_mem':
    version.c:8:12: warning: function returns address of local variable [-Wreturn-local-addr]
         return p;
                ^
    

    p只是一个数组名,在这里代表静态区数组“hello world”复制之后的副本的首字节的基地址,只在get_mem函数里面有效,离开函数之后失效。所以让指针str指向p代表的地址是无法实现的。

    版本3

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    //版本3:
    void get_mem(char **p, int num)
    {
        *p = (char *)malloc(num);
    }
    int main(void)
    {
        char *str = NULL;
        get_mem(&str, 100);
        strcpy(str, "hello");
        printf(str);
    }
    

    没问题

    版本4

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    //版本4
    int main(void)
    {
        char*str = (char*)malloc(100);
        strcpy(str, "hello");
        free(str);
        if (str != NULL)
        {
            strcpy(str, "world");
            printf(str);
        }
    }
    

    str指向“hello”复制之后的数组,但此时直接用free释放str所指向的内存块,str变成悬空指针,此时进入if循环,试图访问或修改释放掉的内存块,导致未定义的行为。

    3.

    #include <stdio.h>
    #include <stdlib.h>
    
    int *divide(int, int,int);
    
    int main(){
        int a,b,digit;
        printf("enter two numbers:");
        scanf("%d %d",&a,&b);
        printf("enter a digit:");
        scanf("%d",&digit);
    
        int *s = divide(a,b,digit);
        for(int i=0;i<digit;i++){
            printf("%d",*s);
            s++;
        }
        free(s);
        
        return 0;
    }
    int *divide(int a,int b,int digit){
        int *p = malloc(digit);
        if(p==NULL){
            printf("error!");
            return NULL;
        }
        for(int i=0;i<digit;i++){
            p[i] = a/b;
            a = (a%b)*10;
        }
        return p;
    }
    

    500位



    1000位



    10000位
    不执行

    4.

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define N 1000000
    
    int main(void)
    {
        srand(time(NULL));
        int *pwds[N];
        int i;
        for(i=0;i<N;i++)
        {
            pwds[i]=malloc(((rand()%N)+1)*sizeof(int));
            if(pwds[i]==NULL){
                printf("failure!");
                return -1;
            }
            //printf("%d\n",pwds[i]);
        }
        for(i=0;i<N;i++)
            free(pwds[i]);
    
        return 0;
    }
    

    5.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define ratio 0.5
    
    void add(int,char *);
    
    int main(){
        int n;
        printf("enter a number:");
        scanf("%d",&n);
    
        char *p = malloc(n*sizeof(char));
        add(n,p);
    
        return 0;
    }
    void add(int n, char *p){
        int j = 0;
        while(1){
            int i = 0;
            int size = pow(2,j)*n*sizeof(char);
            while(i<ratio*size){
                p[i] = 0;
                i++;
            }
            printf("%d %d\n",i,size);
            j++;
            realloc(p,size);
            if(p==NULL){
                printf("failure!");
                exit(EXIT_FAILURE);
            }
        }
        free(p);
    }
    

    相关文章

      网友评论

        本文标题:C语言第13周作业(malloc函数,动态分配数组)

        本文链接:https://www.haomeiwen.com/subject/wosjgktx.html