下面的程序运行时哪里会出现错误

article/2025/11/5 16:34:12

1、下面的程序运行时哪里会出现错误:

struct S

{

    int i;

    int * p;

};

int main()

{

    S s;

    int * p = &s.i;

    p[0] = 4;

    p[1] = 3;

    s.p = p;

    s.p[1] = 1;

    s.p[0] = 2;

    return 0;

}

【题目解析】

这道题考的是对结构体内存使用情况的理解。在32位的操作系统中,int和指针类型的变量占用空间都是4个字节。在本题中 &s.i的值实际就是 &s的值,所以“int * p = &s.i”也就相当于把p指向了结构体s的地址的起始位置。如图1所示。


1

假设 &s的值为0x12300,p的值也是0x12300p[0]指的是从0x12300开始的连续4个字节的空间,p[1]指的是从0x12304注意!不是0x12301)开始的连续4个字节的空间。这样,p[0]也就相当于s.ip[1]也就相当于s.p,分析到这一步,可以确定程序运行到“s.p=p;”这里不会出错。继续往下看。

在进行了“s.p=p;”的赋值之后,s.p指向的是s的首地址,此时s.p[0]相当于s.is.p[1]相当于s.p

下一句“s.p[1]= 1 执行过之后,此时s.p的值为1,也就是指向内存的0x00001处,隐患出现了。在执行“s.p[0]= 2 的时候,实际上是向内存0x00001起始的连续四个字节写入0x00000002,而那块内存不属于这个程序,会出现访问非法内存的错误。

VC解析的汇编代码如下(部分),有兴趣的可以参考一下。
;   14:       S s;
;   15:       int * p = &s.i;

00401028    lea         eax,[ebp-8]
0040102B    mov         dword ptr [ebp-0Ch],eax
;   16:       p[0] = 4;
0040102E    mov         ecx,dword ptr [ebp-0Ch]
00401031    mov         dword ptr [ecx],4
;   17:       p[1] = 3;
00401037    mov         edx,dword ptr [ebp-0Ch]
0040103A    mov         dword ptr [edx+4],3
;   18:       s.p = p;
00401041    mov         eax,dword ptr [ebp-0Ch]
00401044    mov         dword ptr [ebp-4],eax
;   19:       s.p[1] = 1;
00401047    mov         ecx,dword ptr [ebp-4]
0040104A    mov         dword ptr [ecx+4],1
;   20:       s.p[0] = 2;
00401051    mov         edx,dword ptr [ebp-4]
00401054    mov         dword ptr [edx],2
-------------------------------------------------------


http://chatgpt.dhexx.cn/article/IfVOy7aE.shtml

相关文章

Word粘贴文字时遇到报错:运行时错误‘53’:文件未找到:mathpage.WLL 解决方案

Word粘贴文字时遇到报错: 运行时错误‘53’: 文件未找到:mathpage.WLL 问题: 每次装完MathType后,在word里面进行粘贴操作时,总是出现“运行时错误‘53’:文件未找到:MathPage.WLL…

MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 环境 MathType7.4Microsoft Office 365Windows 11 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 Microsoft Word 中使…

JAVA的编译时错误和运行时错误

1. 要区分编译时错误和运行时错误,就应该先明白什么是编译?什么是运行? 首先,先看一下这张图: 编译期就是将我们写的java源代码交给编译器执行的过程,起翻译的作用,该过程主要对java源代码的…

【Word】MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 1. 环境: MathType7.4Microsoft Office 365Windows 11 2. 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 M…

运行程序报错怎么办?

Dev c中常见的报错有几种 一. ld return 1 exit status 这种报错是最常见的,下面是可能的原因 1.库函数拼写错误。如:printf,scanf,等 2.定义的函数名在调用时,函数名拼写错误(这个主要自定义函数啊啥的可能比较多…

java clh队列_J.U.C|同步队列(CLH)

一、写在前面 在上篇我们聊到AQS的原理,具体参见《J.U.C|AQS原理》。 这篇我们来给大家聊聊AQS中核心同步队列(CLH)。 二、什么是同步队列(CLH) 同步队列 一个FIFO双向队列,队列中每个节点等待前驱节点释放共享状态(锁)被唤醒就可以了。 AQS如何使用它&a…

Java CLH队列

一、SMP和NUMA简要介绍 1.1 SMP SMP(Symmetric MultiProcessing)对称多处理是一种包括软硬件的多核计算机架构,会有两个或以上的相同的核心共享一块主存,这些核心在操作系统中地位相同,可以访问所有I/O设备。它的优点…

AQS-CLH同步队列

1:什么是同步队列(CLH) 同步队列 一个FIFO双向队列,队列中每个节点等待前驱节点释放共享状态(锁)被唤醒就可以了。 AQS如何使用它? AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态…

java clh_【死磕Java并发】-J.U.C之AQS:CLH同步队列 - Java 技术驿站-Java 技术驿站

在上篇博客【死磕Java并发】-----J.U.C之AQS:AQS简介中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS…

J.U.C之AQS:CLH同步队列

此篇博客所有源码均来自JDK 1.8 在上篇博客中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等…

CLH Lock 原理

背景 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,一台计算机由多个CPU组成,并共享内存和其他资源,所有的CPU都可以平等地访问内存、I/O和外部中断…

AQS: CLH 介绍

AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node&…

【算法数据结构专题】「线程锁算法专项」初探CLH队列锁机制原理分析

技术扩展 SMP(对称多处理器架构) SMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存&#…

java clh_【Java并发编程实战】—– AQS(四):CLH同步队列

在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。 其主要从双方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获…

JDK内置并发框架AQS对CLH锁的优化

自旋锁的不足 自旋锁适用于锁占用时间短,即锁保护临界区很小的情景。它需要保证各缓存数据的一致性,这可能会导致性能问题。因为在多处理器机器上每个线程对应的处理器都对同一个变量进行读写,而每次读写都要同步每个处理器的缓存。此外,自旋锁无法保证公平性,即不保证先…

面试经典必问:ReentrantLock 中CLH队列

ReentrantLock 中的加锁操作都是通过Syn这个抽象类来完成,具体解析在之前得博客已经分析过了,请参考:ReentrantLock AQS操作解析 得不到锁的线程,如何排队? JUC中锁的排队策略,是基于CLH队列的变种实现的…

java clh_【Java并发编程实战】----- AQS(四):CLH同步队列

在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取…

CLH锁 、MCS锁

一.引文 1.1 SMP(Symmetric Multi-Processor): 对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP能够保证内存一致性…

CLH锁

1.1 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,一台计算机由多个CPU组成,并共享内存和其他资源,所有的CPU都可以平等地访问内存、I/O和外部中断。…

java clh_CLH锁学习

CLH锁即Craig, Landin, and Hagersten (CLH) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。 何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都…