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;
}