Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的内存保护_C_Memory - Fatal编程技术网

C语言中的内存保护

C语言中的内存保护,c,memory,C,Memory,C语言中没有内存保护吗? 进程可以编辑任何内存空间吗? C如何确定一个内存是如何分配的?它是否存储在某个地方? 例如: int a[2] = {2,3}; int *ptrA = &a; int b = 10; int *ptrB = &b; printf("%d ",*(ptrA+1009)); *(ptrA+1009) = 10; printf("%d \n",*(ptrA+1009)); printf("%d ",*(ptrB+1009)); *(ptrB+1009)

C语言中没有内存保护吗? 进程可以编辑任何内存空间吗? C如何确定一个内存是如何分配的?它是否存储在某个地方? 例如:

int a[2] = {2,3};
int *ptrA = &a;

int b = 10;
int *ptrB = &b;

printf("%d ",*(ptrA+1009));
*(ptrA+1009) = 10;
printf("%d \n",*(ptrA+1009));

printf("%d ",*(ptrB+1009));
*(ptrB+1009) = 10;
printf("%d\n",*(ptrB+1009));
这里指向未分配内存的指针具有读/写访问权限。代码段符合并运行时带有警告。 它是未定义的行为/依赖于机器吗?

内存保护并不意味着你认为它意味着什么:它是阻止进程访问它不应该访问的内存的措施。然而,进程当然可以访问自己的内存,这是C/C++和许多其他语言所允许的

这里指向未分配内存的指针具有读/写访问权限

将指针解引用到未分配的是我们所说的软件中的错误:)然而,编译器允许您这样做是完全正确的。C/C++不需要你的支持,如果你想在指针上玩杂耍的话,一定要这样做。如果您试图访问的地址没有映射到进程的内存中(这是工作中的内存保护),您将引发未定义的行为或分段错误,但这些语言允许您这样做。

内存保护并不是您认为它的意思:它是阻止进程访问不应该访问的内存的措施。然而,进程当然可以访问自己的内存,这是C/C++和许多其他语言所允许的

这里指向未分配内存的指针具有读/写访问权限


将指针解引用到未分配的是我们所说的软件中的错误:)然而,编译器允许您这样做是完全正确的。C/C++不需要你的支持,如果你想在指针上玩杂耍的话,一定要这样做。如果您试图访问的地址没有映射到进程的内存中(这是工作中的内存保护),您将引发未定义的行为或分段错误,但这些语言允许您这样做。

不,C中没有内置内存保护,但是使用指针访问它所指向的对象之外的内存——就像您的代码所做的那样——会调用未定义的行为。“未定义的行为”并不意味着程序必须失败或发出任何特定的诊断。这些都是允许的结果,但是如果它们是必需的,那么这就是定义的行为。

不,C中没有内置的内存保护,但是使用指针访问它所指向的对象之外的内存——就像您的代码那样——调用未定义的行为。“未定义的行为”并不意味着程序必须失败或发出任何特定的诊断。这些都是允许的结果,但如果需要,那么这将是定义的行为。

C/C++标准没有任何取消引用地址的要求。它们提供对原始内存的访问,因此具有足够的通用性,可以在裸机、虚拟内存系统等上使用。。。因此,就语言而言,通过指向另一个变量或任何内存引用的指针的偏移量来访问变量是完全有效的。但它是未定义的行为,因此实际行为通常取决于运行时和/或操作系统和/或硬件

不过,这个编译器可以自由地向所有内存引用添加边界检查。然而,C/C++的一般好处是对内存的原始访问。运行时边界检查通常过于昂贵,不适合生产使用,但它通常用于调试以查找这些类型的错误。有关运行时边界检查的良好示例,请参阅或address sanitizer


不过,大多数编译器都会提供基本的静态边界检查警告。您通常可以(应该)使用类似于
-Werror
的开关将它们转换为错误。还有各种静态分析器,可以识别潜在的和可验证的越界访问。

C/C++标准对解引用地址没有任何要求。它们提供对原始内存的访问,因此具有足够的通用性,可以在裸机、虚拟内存系统等上使用。。。因此,就语言而言,通过指向另一个变量或任何内存引用的指针的偏移量来访问变量是完全有效的。但它是未定义的行为,因此实际行为通常取决于运行时和/或操作系统和/或硬件

不过,这个编译器可以自由地向所有内存引用添加边界检查。然而,C/C++的一般好处是对内存的原始访问。运行时边界检查通常过于昂贵,不适合生产使用,但它通常用于调试以查找这些类型的错误。有关运行时边界检查的良好示例,请参阅或address sanitizer


不过,大多数编译器都会提供基本的静态边界检查警告。您通常可以(应该)使用类似于
-Werror
的开关将它们转换为错误。还有各种静态分析器,可以识别潜在的和可验证的越界访问。

无保护。事实上,这是一种未定义的行为,所以要小心那些带木棍的喷火龙和巨魔。可能是未定义行为的复制品。但是,如果您在Windows上运行,您可能会触发“0xC0000005访问冲突错误”,但这也不是必然的。是的,我们没有内存保护。C++中也是这样,虽然它是一种不同的语言,但是请不要把C问题标记为C++。(这种缺乏保护的做法有很多好处——有效程序的性能更好。)
int*ptrA=&a
错误,因为
a
已经是指向第一个元素的指针。你想要的是
int*ptrA=a
int**ptrA=&a。无保护。事实上,这是一种未定义的行为,所以要小心那些带木棍的喷火龙和巨魔。可能是未定义行为的复制品。但是,如果您在Windows上运行,您可能会触发“0xC0000005访问冲突错误”,但这也不是必然的。是的,我们没有内存保护。在C++中也是这样,虽然它是不同的语言-请做