程序猿之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小

#include <stdio.h> 

char * favorite_fruit()
{
	static char fruit[] = "apple";  // 不加static的话这个函数还回的指针以及悬空,因为在函数退出时fruit组数被销毁
	                                // 加了static后fruit数组分配在数据段里,而不是堆栈中,生命期和程序一样长,函数退出时变量
									// 依然有效
	return fruit;
}
int main()
{
	char *a = favorite_fruit();
	printf("%s\n",a);

	/*
	 *	查看你的进程能分配多大内存
	 *  总共分配的内存量取决于系统配置的
	 */
	int MB = 0;

	while(malloc(1 << 10)) ++KB;
	printf("Allocated %d KB total\n", KB);

	return 0;
}

输出:

时间: 2024-10-01 04:47:01

程序猿之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小)的相关文章

程序员之---C语言细节22(函数返回指针注意事项&amp;lt;悬空指针&amp;gt;、查看进程能够分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针会悬空,由于在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中.生命期和程序一样长,函数退出时变量 // 依旧有效 return fruit; }

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

程序猿之---C语言细节27(函数无参数时细节、函数默认返回int型证明、return默认还回值、void指针++操作)

主要内容:函数无参数时细节.函数默认返回int型证明.return默认还回值.void指针++操作 一.函数无参数时细节 函数无参数时应该加上void 在c语言中一个函数 void f(); 在使用时传递参数f(2);没有报错,而在c++中则会报错 最好加上void来明确函数是无参数的 二.函数默认返回类型为int型 见下面程序 三.return默认返回1 细节:return不可返回执行栈内存中的指针,因为该内存在函数体结束时自动销毁 四.void 指针++操作 void *p; p++; //

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE

程序猿之---C语言细节5

主要内容:字符串内存分配.合并两个字符串 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* * 字符串操作:内存分配 * 字符串s和t,希望将这两个字符串连接成单个字符串r */ char* s = "abc"; char* t = "def"; // 方法一: 缺点:1.不能确定r指向何处: // 2.同时不知道r所指向的内存空间是否有可

程序猿之---C语言细节17(求time_t的最大值、strlen求的是长度、malloc分配字符内存细节、switch的中default细节)

主要内容:求time_t的最大值.strlen求的是长度.malloc分配字符内存细节.switch的中default细节 #include <stdio.h> #include <time.h> int main() {     /*****************************************************************         time_t最大值测试     ************************************

程序猿之---C语言细节26(C语言中布尔类型、continue细节、sizeof举例、strlen举例)

主要内容:C语言中布尔类型.continue细节.sizeof举例.strlen举例 一.布尔类型 可能很多人不知道现在C语言已经有了布尔类型:从C99标准开始,类型名字为"_Bool" 在C99标准之前我们常常自己模仿定义布尔类型,常见有以下几种方式: 1.方式一 #define TURE 1 #define FALSE 0 2.方式二 typedef enum {false, true} bool; 3.方式三 typedef int bool 闲int浪费内存,对内存敏感的程序使

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)

主要内容:const变量初始化.数组大小用const变量细节.const变量与#define宏.volatile修饰 一.const变量初始化时必须赋值 二.const变量在C++中可以做数组大小元素.在C中不行,因为它是变量 三.const和#define区别:内存分配 四.volatile修饰一些变量:易被操纵系统.硬件.多线程修改的变量 #include <stdio.h> int main() { /* 测试1 */ const int b; // 不初始化会报错 // b = 2;