【问题标题】:Pointer assignment to r-value in cc 中指向 r 值的指针赋值
【发布时间】:2019-03-13 01:20:54
【问题描述】:

谁能帮助解释为什么运行执行文件(使用 Dev-C++ 5.6.3 从以下 C 程序构建)会导致崩溃? Pradip Dey 和 Ghosh Manas 2013 Computer basics and programming in C 中有一些解释说“位置 1000 可能包含该程序。由于它是只读的,因此操作系统将引发分段错误。*pi = 5 怎么样? 同样,它很可能会导致分段错误,因为较低的内存地址通常用于程序代码。这个区域是只读的。应该提前知道这个常量在内存中的位置。"

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

int main()
{
    int *ip;

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

【问题讨论】:

  • 当您写入某个任意选择的内存位置时,您希望程序执行什么操作?
  • 你希望程序做什么?
  • 大概是这样运行的:...ip = (int*)1000; *ip = 5; (SegFault)
  • 它正在崩溃,因为您正在访问您不应该访问的内存。

标签: c pointers


【解决方案1】:

在大多数情况下,指针只是内存中数据的地址。关于哪些内存地址是可访问的,哪些是不可访问的,哪些地址被代码和数据使用,……内存空间是分段的,这意味着某些地址甚至不可用。

你已经声明了一个指针int *ip; 然后你给它赋值1000。后者应该是内存中某些数据的地址。为什么是1000?它可能是无法访问的内存地址,也可能是其他数据的内存地址或程序代码的内存地址。通常,除非您编写系统级软件,否则您不能对内存中的硬编码地址做任何假设。您只能依赖您的程序提供的地址。因此,您尝试为地址 1000 的内存分配值最终导致分段错误,这意味着您无法使用该地址。

有几种方法可以正确使用指针。

1) 使用现有变量的地址:

 int var;
 int *ip = &var;
 *ip = 5;

2) 使用返回给您的动态分配内存地址,例如malloc

 int *ip = malloc(sizeof(int));
 *ip = 5;
 ...
 free(ip);

【讨论】:

    【解决方案2】:

    但下面的分配似乎没问题:

    char *ptr;
    
    ptr = "Input a string: ";
    printf("%s", ptr);
    

    数值类型的右值和字符串的右值有什么区别?

    实际上我发现这很有帮助: 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*?

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2011-10-27
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多