将指针分配给c中的r值

时间:2019-03-13 01:20:55

标签: c pointers

有人可以帮助解释为什么运行执行文件(使用Dev-C ++ 5.6.3由以下C程序构建)会导致崩溃吗? Pradip Dey和Ghosh Manas 2013中有一些解释,用C表示“位置1000可能包含该程序。由于它是只读的,因此操作系统将引发分段错误。* pi = 5怎么办?”再次,这很可能会导致分段错误,因为程序代码通常使用较低的存储器地址。仅读取该区域。应预先知道此常数在存储器中的位置。”

但是,对我来说,这些解释很难理解

int main()
{
    int *ip;

    ip = (int*)1000;
    *ip = 5;
}

2 个答案:

答案 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*?