有人可以帮助解释为什么运行执行文件(使用Dev-C ++ 5.6.3由以下C程序构建)会导致崩溃吗? Pradip Dey和Ghosh Manas 2013中有一些解释,用C表示“位置1000可能包含该程序。由于它是只读的,因此操作系统将引发分段错误。* pi = 5怎么办?”再次,这很可能会导致分段错误,因为程序代码通常使用较低的存储器地址。仅读取该区域。应预先知道此常数在存储器中的位置。”
但是,对我来说,这些解释很难理解
int main()
{
int *ip;
ip = (int*)1000;
*ip = 5;
}
答案 0 :(得分:2)
在大多数情况下,指针只是内存中数据的地址。关于哪些地址可访问,哪些地址不可访问,代码和数据使用哪些地址,有一些考虑,...存储空间是分段的,这意味着某些地址甚至不可用。
您已声明了指针int *ip;
,然后为其分配了值1000
。后者应该是内存中某些数据的地址。为什么是1000?它可能是无法访问的内存地址,也可能是其他数据的内存地址,或者是程序代码的内存地址。通常,除非您编写系统级软件,否则您无法对内存中的硬编码地址做任何假设。您只能依靠程序提供的地址。因此,您尝试为地址1000的内存分配值的操作最终出现分段错误,这意味着该地址不可用。
有几种正确使用指针的方法。
1)使用现有变量的地址:
int var;
int *ip = &var;
*ip = 5;
2)使用malloc
int *ip = malloc(sizeof(int));
*ip = 5;
...
free(ip);
答案 1 :(得分:0)
但是以下分配似乎没问题:
char *ptr;
ptr = "Input a string: ";
printf("%s", ptr);
数字类型的r值和字符串的r值之间有一些区别吗?
实际上,我发现这很有帮助: In C, why can't an integer value be assigned to an int* the same way a string value can be assigned to a char*?