美文网首页散文简友广场想法
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++ new 和 delete 运算符

    在 C 语言中,动态分配内存用 malloc () 函数,释放内存用 free () 函数。如下所示: 在 C++...

  • malloc从原理到实践

    简介 使用过c语言的都知道malloc是一个动态分配内存的函数malloc的全称是memory allocatio...

  • C语言内存分配函数比较

    一、函数介绍 1.1 函数原型 C语言应用程序编程中动态分配内存的函数主要有realloc、malloc、call...

  • C语言的malloc

    为什么C语言要有malloc malloc就是memory allocate动态分配内存,malloc的出现时为了...

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

    1. 1. 2. 3. 2. 版本1 对str初始化为空指针,但是传入get_mem()函数时是str的副本,在离...

  • c++动态分配浅析

    1. c语言中动态分配和释放. 在c中,申请动态内存是使用malloc和free,这两个函数是c的标准库函数,分配...

  • C语言-用指针实现内存动态分配

    动态存储分配函数 在C语言中,动态分配内存是通过动态存储分配函数 malloc() 来实现的,其功能是: 在内存的...

  • 三. 串与矩阵

    一. 串 字符串大多使用堆分配存储, 堆由C语言的动态分配函数malloc和free来管理. 串的模式匹配 问题:...

  • C++———动态内存分配

    动态内存分配用于提高内存的利用率,在c语言中使用malloc内置函数动态分配内存,而在c++中使用new运算符进行...

  • [c/c++]2.malloc、calloc、realloc

    储存空间动态分配 ISO C说明了3个用于存储空间动态分配的函数。 (1)malloc,分配指定字节数的存储区。此...

网友评论

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

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