尝试从常量 char * 类型的指针复制数据时出现“超出内存访问”错误。为啥?

     2023-02-16     294

关键词:

【中文标题】尝试从常量 char * 类型的指针复制数据时出现“超出内存访问”错误。为啥?【英文标题】:Getting "accessing beyond memory" error when it is tried to copy data from a pointer of type constant char *. Why?尝试从常量 char * 类型的指针复制数据时出现“超出内存访问”错误。为什么? 【发布时间】:2014-03-31 10:41:20 【问题描述】:

以下语句引发超出内存错误的访问。我仍然不确定它为什么会那样做。谁能帮我在这里做错了什么?谢谢

    memcpy(mhp_ptr->dpair[0].dpairid, id0, 8);

这里 id0 的类型是 const char *

其中,mhp_ptr 是 mhp_t * 类型,其定义如下:-

typedef struct mhp_s 
 
    uint8_t  editor[16];
    uint64_t refcode;
    uint64_t error_id;
    union
    
        uint8_t dpairtbl[16][6];
        dpairtbl_t dpair[6];
    ;
  mhp_t;

而dpairtbl_t定义如下:-

typedef struct dpairtbl_s
 
    char  dpairid[8];
    uint64_t dpairdata;
 dpairtbl_t;

错误:- 访问超出分配的内存 “memcpy”可以从缓冲区“id0”中读取 8 个字节

我的项目的编译器设置将警告视为错误。正常编译工作正常,但它发出一个警告,根据我的编译器中的设置被视为错误。 只是想知道为什么它对 strcpy 工作正常,但在 memcpy 的情况下发出警告。在字符串的情况下,对 memcpy 的使用是否有任何 C++ 限制

【问题讨论】:

嗯,id0 指向的内存是多少? 您将 8 个字符的大小 + 一个 int64 写入包含 8 个字符的内存中。 id0 是 const char* 类型。如果我使用 strcpy 它可以正常工作,我不会收到任何错误,但如果我使用 memcpy 它会引发错误 【参考方案1】:

memcpy 视为内存中字节的复制:

memcpy(mhp_ptr->dpair[0].dpairid, id0, 8);

如果id0的长度小于8,memcpy也会复制不属于你的内存,如果是8个或更多字符,dpairid不会为null-正确终止。

如果您无法保证 id0 的大小正好是 8 个字节,则应将其视为字符串,以便根据终止字符确定长度:

strncpy (mhp_ptr->dpair[0].dpairid, id0, 7);
mhp_ptr->dpair[0].dpairid[7] = '\0';

【讨论】:

即使我使用 8 而不是 sizeof(dpairtbl_t) 也会引发错误,抱歉编辑了问题以避免混淆 @user3480704:告诉我们id0是如何定义和初始化的。 @user3480704 然后我们回到 id0 中有什么的问题 id0 被定义为 const char * id0 作为功能参数之一。它基本上包含提供错误信息的字符串。【参考方案2】:

一个潜在的问题是您正在复制到 dpairid(大小为 8),大小为 dpairtbl_t(可能为 16)

要么你的尺寸有误(使用 sizeof(dpairid)),要么

typedef struct dpairtbl_u
 
     char  dpairid[8];
     uint64_t dpairdata;
 dpairtbl_t;

应该是联合

typedef union dpairtbl_u
 
     char  dpairid[8];
     uint64_t dpairdata;
 dpairtbl_t;

【讨论】:

它只是 struct 类型,如果我使用 strcpy,它可以正常工作,但在 memcpy 的情况下会引发错误。抱歉造成混淆,编辑问题以进一步澄清 @user3480704 with strcpy 如果 id0 的长度小于 8,它将起作用,因为 strcpy 在找到字符串末尾的 '\0' 时停止。 是的,这正是为什么对于任何未来与字符串相关的操作,我想知道 memcpy 是否是正确的前进方式 如果可以,请使用 std::string ...要复制的字符数(以免超出目标缓冲区)。【参考方案3】:

除了其他答案之外,我没有收到任何错误并且它有效。这是我的代码:

const char* id0 = "*** question";
mhp_t* mhp_ptr = new mhp_t;

memcpy(mhp_ptr->dpair[0].dpairid, id0, sizeof(dpairtbl_t));

cout << mhp_ptr->dpair[0].dpairid << endl;

delete mhp_ptr;

输出是:

stackove

当我查看sizeof(dpairtbl_t) 值时,它是8。也许您忘记了指针mhp_ptr 的分配/初始化。以及如何初始化id0

【讨论】:

id0 作为字符串传递。正常编译工作正常,但它发出一个警告,根据我的编译器中的设置被视为错误。只是想知道为什么它对 strcpy 工作正常但在 memcpy 的情况下发出警告。有C++限制吗?

尝试使用指向 char* 的指针时出现总线错误 10 或分段错误 11,具体取决于封装

】尝试使用指向char*的指针时出现总线错误10或分段错误11,具体取决于封装【英文标题】:buserror10orsegmentationfault11whentryingtousepointerstochar*dependingonencapsulation【发布时间】:2014-09-1606:38:48【问题描述】:我正在尝试使用基本char*并... 查看详情

将指向常量的指针作为参数传递时出现问题

】将指向常量的指针作为参数传递时出现问题【英文标题】:Issuewhilepassingpointertoconstantasanargument【发布时间】:2014-09-2506:29:21【问题描述】:在此例如,使用按地址调用的概念来检索函数调用中发生的所有数据更改...在main(),i)... 查看详情

尝试使用 pyspark 从 S3 获取数据时出现空指针异常

】尝试使用pyspark从S3获取数据时出现空指针异常【英文标题】:NullpointerexceptionwhentryingtofetchdatafromS3usingpyspark【发布时间】:2016-11-1103:02:42【问题描述】:当我。我正在使用hadoop2.4运行spark1.6.1。我尝试同时使用s3n和s3a。也尝试通... 查看详情

尝试从数据库下载“图像”列内容时出现日期类型转换错误

】尝试从数据库下载“图像”列内容时出现日期类型转换错误【英文标题】:Datetypeconversionerrorwhentryingtodownload\'image\'columncontentsfromdatabase【发布时间】:2018-08-1305:33:12【问题描述】:我正在尝试下载存储在数据库表中的所有文件... 查看详情

从firebase检索时出现空指针异常[重复]

...中获取数据所有权限都是公开的并且包括依赖项。我正在尝试将数据打印到logcat,收到NullPointerExceptionMainActivity.javaimportandroi 查看详情

尝试从 Apache Beam 中的选项获取值时出现空指针异常

】尝试从ApacheBeam中的选项获取值时出现空指针异常【英文标题】:GettingNullPointerexceptionwhiletryingtogetvaluefromoptioninApachebeam【发布时间】:2021-10-0517:34:17【问题描述】:我正在使用JAVA8和ApacheBeam2.19.0来运行一些数据流作业。根据我... 查看详情

尝试从方法返回指向对象的指针时出现分段错误

】尝试从方法返回指向对象的指针时出现分段错误【英文标题】:Segmentationfaultwhiletryingtoreturnapointertoobjectfromamethod【发布时间】:2016-06-0611:06:21【问题描述】:g++在我尝试从classA的方法返回classB的对象时抛出“分段错误”。我不... 查看详情

从应用程序创建 SQLite 数据库时出现空指针异常 [重复]

...icate]【发布时间】:2017-06-0706:08:25【问题描述】:我正在尝试制作一个简单的应用程序,该应用程序可以获取用户输入的信息并将其存储在Android手机的数据库中。我的代码如下:importandroid.database.sqli 查看详情

将 db 从资产复制到设备数据文件夹时出现 FileNotFoundException

...cedatafolder【发布时间】:2015-04-0816:35:15【问题描述】:我尝试了多种方法将我的sqlitedb文件复制到我的/data/data/packagename/databases文件夹,但我仍然卡在FileNotFo 查看详情

C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题

】C-当我尝试将结构从数组复制到结构中包含的数组时出现问题【英文标题】:C-ProblemwhenItrytocopyastructfromanarraytoanarraycontainedinastruct【发布时间】:2021-09-0512:56:37【问题描述】:好的,所以我有两个结构(玩家和团队),它们分... 查看详情

尝试从 Kotlin 中的另一个活动访问 EditText 时出现空指针异常

】尝试从Kotlin中的另一个活动访问EditText时出现空指针异常【英文标题】:Null-PointerExceptionwhentryingtoaccessanEditTextfromanotheractivityinKotlin【发布时间】:2019-03-1621:19:46【问题描述】:编辑:使用startActivityForResult()解决在Kotlin中,我试... 查看详情

c语言const关键字用法(常量指针-const在*左边-修饰数据类型-内存不变|指针常量-const在*右边-修饰变量-指针不变)(代码片段)

文章目录一、const普通用法二、常量指针(指向常量的指针|被指向的内存不能被修改)三、指针常量(指针不能被修改)三、指向常量的指针常量四、const在*左右的意义一、const普通用法const关键字在C和C++中的表现不同,本篇博客... 查看详情

从不同的类调用方法时出现空指针异常

...rentclass【发布时间】:2015-10-2109:26:03【问题描述】:当我尝试从另一个类调用方法loadUserList()时,我收到以下错误:Attempttoinvokevirtualmethodandroid.content.res.Resourcesandroid.conte 查看详情

对数据帧火花执行操作时出现空指针异常

...RDD创建数据帧。我可以对RDD执行操作,并且RDD不为空。我尝试了以下两种方法。两者我都得到了同样的例外。方法1:使用sparkSession.createDataf 查看详情

026.常量区

语言中的指针很重要。站到汇编角度理解指针,就是存放一个内存地址的内存地址。所以说,每一个指针都是一个变量。只不过这个变量是用来存放一个内存地址.在32位中,内存地址是从0x00000000-0xFFFFFFFFconst关键字所以,每一个指... 查看详情

从文件/rdd 读取数据时出现 Unicode 错误

...013:15:41【问题描述】:从文本文件中获取数据后,我正在尝试创建具有正确架构的数据框。在RDD中,所有数据类型都是字符串,但是其中一种字段数据类型是整数,我想确保将其创建为整数。所以我创建了Structtype并创建了数据... 查看详情

尝试初始化结构向量时出现编译错误

】尝试初始化结构向量时出现编译错误【英文标题】:Compilationerrorwhentryingtoinitializevectorofstructs【发布时间】:2020-01-0809:28:11【问题描述】:我正在尝试初始化结构向量,但出现编译错误。就我的理解而言,当struct包含简单的数... 查看详情

将字符串从 std::string 转换为 const char * 时出现数据丢失问题

】将字符串从std::string转换为constchar*时出现数据丢失问题【英文标题】:Datalossissuewhileconvertingthestringfromstd::stringtoconstchar*【发布时间】:2014-08-2106:31:56【问题描述】:在此函数中,将string作为参数传递(将大量数据作为字符串... 查看详情