最近这几天在看勇哥的《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;
// 由于这里分配的是动态内存,因此可以将在子函数中分配的内存空间的指针返回到主函数中,这样就不存在静态内存那样的问题了
}
学习了静态内存和动态内存,谢谢代码,很有意思,希望和大家一起学习。