当我学习指针时,我有一个想法可以更好地了解 内存分配,所以我尝试手动将内存分配给指针, 但这没用。 有人可以解释更多吗?我什么都没找到。
我写了一些C代码,该代码分配了一个指针并打印位置
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *test;
test = malloc(sizeof(char*));
test[0] = 't';
test[1] = 'e';
test[2] = 's';
test[3] = 't';
test[4] = ' ';
test[5] = ' ';
test[6] = ' ';
test[7] = ' ';
printf("%p\n",test);
printf("%p\n",test[0]);
printf("%p\n",test[1]);
printf("%p\n",test[2]);
printf("%p\n",test[3]);
printf("%p\n",test[4]);
printf("%p\n",test[5]);
printf("%p\n",test[6]);
printf("%p\n",test[7]);
}
当我执行它时,输出是这个 在执行上只有第一行发生改变
0x561160
0x74
0x65
0x73
0x74
0x20
0x20
0x20
0x20
所以写其他
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *memory;
memory = malloc(1);
// memory = 0x561160;
memory[0] = 0x74;
memory[1] = 0x65;
memory[2] = 0x73;
memory[3] = 0x74;
memory[4] = 0x72;
memory[5] = 0x20;
memory[6] = 0x20;
memory[7] = 0x20;
printf("%s",memory);
}
如果我分配了内存,程序将获得输出“ test”(很好)
但是,如果我使用注释的内存位置(从其他程序获得的位置),则该程序崩溃,有人可以告诉我,如果我不释放另一个指针,为什么该程序崩溃?
答案 0 :(得分:1)
在现代操作系统上运行程序(进程)时,它将获得自己的地址空间。该地址空间在整个过程中都存在,但是在过程结束时会清除。此外,不同进程的地址空间是完全相互隔离的。
有了这个,您不能简单地获取程序打印的指针,然后在其他进程中使用它。
在此处了解更多信息:https://en.wikipedia.org/wiki/Process_management_(computing)
另一个问题是,您的两个示例都没有为memory
分配足够的存储空间。