第二,而你的程序退出后,所拥有的空间就被系统全部回收了。也就不存在了。否则,你c语言乱改一通,要是改到系统正在用的内存,系统不就出现异常了吗。内存并不是由你管理的,而是操作系统管理的。
假设 a程序的 p指针,指向 0xaaa地址 ,你修改 b程序的 p指针,指向0xaaa,也是无法修改的,每个程序的内存都是系统虚拟的。保证程序可以安全稳定的执行。
据我所知,创建数组需要2个参数,1是地址,2是分配空间。空间分配是不能重复的,也就是说创建2个数组,这两个数组是不可能重合的,为了防止这种事情出现,所以不能指定地址。而是编译器自动分配,不能人为。但是可以省去分配空间这个步骤,而是只创建地址,这就是指针的概念。比如int a[12],你若是想创建另一个代替a[12],可以int *p=a这样,p的值就是a数组的首地址了。int *p =(int*)0x80000意思就是p[0]的地址是0x80000,创建的时候要确定(int*)0x80000已经分配过了,可以使用了,不然就相当于野指针,容易出错。
//获取指定目录下的所有文件列表 author:wangchangshaui jluchar** getFileNameArray(const char *path, int* fileCount)
{
int count = 0
char **fileNameList = NULL
struct dirent* ent = NULL
DIR *pDir
char dir[512]
struct stat statbuf
//打开目录
if ((pDir = opendir(path)) == NULL)
{
myLog("Cannot open directory:%s\n", path)
return NULL
}
//读取目录
while ((ent = readdir(pDir)) != NULL)
{ //统计当前文件夹下有多少文件(不包括文件夹)
//得到读取文件的绝对路径名
snprintf(dir, 512, "%s/%s", path, ent->d_name)
//得到文件信息
lstat(dir, &statbuf)
//判断是目录还是文件
if (!S_ISDIR(statbuf.st_mode))
{
count++
}
} //while
//关闭目录
closedir(pDir)
// myLog("共%d个文件\n", count)
//开辟字符指针数组,用于下一步的开辟容纳文件名字符串的空间
if ((fileNameList = (char**) myMalloc(sizeof(char*) * count)) == NULL)
{
myLog("Malloc heap failed!\n")
return NULL
}
//打开目录
if ((pDir = opendir(path)) == NULL)
{
myLog("Cannot open directory:%s\n", path)
return NULL
}
//读取目录
int i
for (i = 0(ent = readdir(pDir)) != NULL &&i <count)
{
if (strlen(ent->d_name) <= 0)
{
continue
}
//得到读取文件的绝对路径名
snprintf(dir, 512, "%s/%s", path, ent->d_name)
//得到文件信息
lstat(dir, &statbuf)
//判断是目录还是文件
if (!S_ISDIR(statbuf.st_mode))
{
if ((fileNameList[i] = (char*) myMalloc(strlen(ent->d_name) + 1))
== NULL)
{
myLog("Malloc heap failed!\n")
return NULL
}
memset(fileNameList[i], 0, strlen(ent->d_name) + 1)
strcpy(fileNameList[i], ent->d_name)
myLog("第%d个文件:%s\n", i, ent->d_name)
i++
}
} //for
//关闭目录
closedir(pDir)
*fileCount = count
return fileNameList
}