哈佛大学公开课:计算机科学cs50 学习笔记(第6集:C语言,RAM)

1. 关于变量对内存的使用

#include <stdio.h>

void swap(int, int);

int 
main(void)
{
	int x = 1;
	int y = 2;
	swap(x, y);
	printf("x=%i\n", x);
	printf("y=%i\n", y);
	return 0;
}

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	printf("a=%i\n", a);
	printf("b=%i\n", b);
}

以上这段代码中swap()并没有起到交换x,y的值的作用。

程序运行时,main对应的RAM中的两块名字分别为x,y的值分别被拷贝到swap对应的RAM的名字为a,b的两块内存中,当swap运行结束后,它对应的RAM被释放,即被计算机“遗忘”。因此x,y的值不变

2. RAM的分配

text 部分存储编译后的二进制文件,如源代码。initialized data 和 uninitialized data 分别存储初始化和未初始化的全局变量; heap 负责动态内存分配的内存(如 malloc()函数) 自上而下增长,stack负责存储函数调用,包括局部变量,参数,函数地址以便函数调用结束后还能回到原来调用它的函数继续运行,自下而上增长,当两者发生碰撞时,就会有segmentation error 段错误(核心已转储)。例如下面这段代码。

void foo(void);

int main(void)
{
	foo();
	return 0;
}

void foo(void)
{
	foo();
}

关于堆栈的详细讲解:https://blog.csdn.net/yingms/article/details/53188974

3. main函数的参数

int
main(int argc, char const *argv[])
{
	/* code */
	return 0;
}

argc 记录命令行接受的参数个数,至少为1,因为总要输入生成的可执行文件的名字。argv[ ]接受命令行参数,类型为char*。

char* 就相当于C++ 里面的string,就是一个字符串,就是一个字符数组。

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

int
main(int argc, char const *argv[])
{
	for (int i = 0; i < argc; ++i)
	{
		for (int j = 0, n = strlen(argv[i]); j < n; ++j)
		{
			printf("%c\n", argv[i][j]);
		}
		printf("\n\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shaozhenghan/article/details/81256477