(《Linux环境下C语言编程指南》学习笔记一)C语言中的静态内存分配和动态内存分配

最近这几天在看勇哥的《Linux环境下C语言编程指南》,对我这样低水平的学习者来说这本书还不错,做个学习记录吧。

第二章   

(一)静态内存

静态内存:静态内存的申请是由编译器来分配的,对于用户程序中的各种便利,编译器在编译源程序的同时处理了为各种变量分配所需内存的工作。

优点:方便,不需要考虑释放内存;缺点:事先定义大小,不能扩展,容易溢出,如果事先定义过大又造成浪费;缺点2:函数返回值不能用函数内分配的静态内存,因为那时候那个变量对应的内存已经被释放了,如以下的例子就不能实现预期功能。

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


char* upcase(char *inputstring);


int main(){
        char *str1;
        str1=upcase("Hello");
        printf("str1=%s\n",str1);
        return 0;
}


char *upcase(char* oldstring){
        int counter;
        char newstring[100];
        strcpy(newstring,oldstring);
        for(counter=0;counter<strlen(newstring);counter++){
                if(newstring[counter]>=97&&newstring[counter]<=122)
                        newstring[counter]-=32;
        }
        return newstring;
        //It is wrong to return a local variable here!Please follow staticMemoryRight.c
}

以上错误有两种方式解决,一是可以通过在main函数中定义一个变量替代子函数中的变量,如下所示:

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


char* upcase(char *inputstring,char* newstring);


int main(){
        char newstring[100];
        //str1=upcase("Hello",newstring);
        upcase("Hello",newstring);
        printf("str1=%s\n",newstring);
        return 0;
}


char *upcase(char* oldstring,char* newstring){
        int counter;
        //char newstring[100];
        strcpy(newstring,oldstring);
        for(counter=0;counter<strlen(newstring);counter++){
                if(newstring[counter]>=97&&newstring[counter]<=122)
                        newstring[counter]-=32;
        }
        //return newstring;
}

还有一种方式就是用动态内存的方式来解决,代码如下所示:

#include <stdio.h>
#include <string.h>
#include <malloc.h>//这是为了使用free和malloc函数
#include <stdlib.h>//这是为了使用exit函数


char* upcase(char *inputstring);
int main(){
        char *str1;
        str1=upcase("Hello");
        printf("str1=%s\n",str1);
        free(str1);
        return 0;
}


char* upcase(char* inputstring){
        char *newstring;
        int counter;
        if(!(newstring=malloc(strlen(inputstring)+1))){
                printf("Error");
                exit(255);
        }
        strcpy(newstring,inputstring);
        for(counter=0;counter<strlen(inputstring);counter++)
                if(newstring[counter]>=97&&newstring[counter]<=122)
                        newstring[counter]-=32;
        return newstring;
        // 由于这里分配的是动态内存,因此可以将在子函数中分配的内存空间的指针返回到主函数中,这样就不存在静态内存那样的问题了
}

学习了静态内存和动态内存,谢谢代码,很有意思,希望和大家一起学习。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值