指针函数返回值被截断问题

【易混点—数据存储的截断问题和指针解引用访问问题】 介绍了困扰我个人的有关数据存储截断和指针解引用的混淆问题,欢迎批评指正! 阅读详情

问题源码

struct xxxid_stats *diff = create_diff(cs, ps, &diff_len);

这个函数会返回结构体指针,结构体的内存空间在函数内部申请。预期是函数返回后访问diff指针来获取内部成员变量值,但此时如果访问diff指针会报段错误。使用gdb debug发现

返回值在函数返回前是正常的,但是返回后内存地址被截断:比如地址0x5555556029d0,返回后地址被截断成0x556029d0,导致返回值为无效的内存地址,进而产生段错误。

进使用gdb进行调试,查看寄存器状态,发现的确是返回之后rax(保存返回值的寄存器)寄存器发生了改变

通常情况下,一般不存在其他模块修改这个返回值的可能,同时函数内部实现也很简单,基本不存在堆栈溢出的可能性,找GPT分析了下,得到了最可能的原因:

函数返回值未正确传递:在某些情况下,编译器可能未能正确传递函数的返回值。例如,当返回一个结构体指针时,可能存在一些编译器或调用约定相关的问题。

问题原因:

在调用函数时,没有进行函数声明,导致编译器并不知道函数的正确的返回值是什么样的,继而引发编译按照既定约定编译代码,可以看到在编译时的报警:

在正确声明函数定义之后,问题消除.

GAMIT/GLOBK 10.71在Linux环境下的GNSS数据处理全流程解析(附实战案例) 本文详细解析了在Linux环境下部署和运行GAMIT/GLOBK 10.71进行GNSS数据处理的完整流程。从系统环境配置、软件编译安装、关键表格文件更新,到运行自带示例和实战案例,提供了清晰的步骤与避坑指南,帮助用户掌握这一高精度GNSS数据处理工具的核心使用方法。 阅读详情

相关推荐

LTC3783 LED驱动控制器设计与效率优化详解

开关电源控制器是现代LED照明的核心器件,通过电流模式控制实现高效能量转换。其核心原理是通过采样电阻检测负载电流,配合误差放大器形成闭环调节,在汽车电子、显示背光等场景中确保±3%的电流精度。LTC3783作为典型代表,集成升压/降压-升压多拓扑支持,配合PWM调光技术可实现3000:1的无色偏调光范围。在工程实践中,需重点考量功率电感选型、MOSFET开关损耗与热管理设计,例如在38W功率方案中采用10μH/5A电感和4.5mΩ MOSFET可达成95%效率。该方案特别适用于需要应对9-36V宽输入电压波

weixin_36231030的博客 399

C指针截断问题(形如0xaaaabbbbccccdddd > 0xffffffffccccdddd)

C编码中可能会遇到函数返回值地址被截断的问题,这里做下场景复现和分析。 复现 以PG14的这段代码为例,xxx.c文件中使用relation_open函数打开表,然后使用变量。 ... /* xxx.h */ typedef struct RelationData *Relation; #define RelationGetDescr(relation) ((relation)->rd_att) /* relation.h */ extern Relation relation_open(Oid

InternalsOf 2378

中小团队必看!用Harbor+Jenkins打造轻量级K3S交付流水线(含成本优化方案)

本文为中小团队详细介绍了如何利用K3S、Harbor与Jenkins构建一套高性价比的自动化交付流水线。内容涵盖单节点K3S集群的效能配置、Harbor镜像仓库的磁盘空间优化、Jenkins共享库实现流水线复用,并提供了完整的实战案例与成本优化方案,帮助团队以较低成本快速落地高效的自动化部署。

weixin_29223603的博客 503

C函数返回指针位数错误,截断问题

问题描述 在C工程中,一个64位系统中如果一个文件中的某个函数A调用另外一个文件中的函数B,但是A文件中没有包含B的声明,gcc可以编译通过,但是如果B函数的返回类型为指针,在64位系统应该返回64bit地址,实际上函数A调用B得到的B的返回指针却是32bit,高32bit被截断。 代码示例 https://github.com/musiclvme/ToolsPackages/t...

musiclvme的专栏 2749

基于WEB的报价管理系统的设计与实现

该系统采用B/S模式,后台运用SpringMVC和MyBatis搭建,利用MySQL数据库,来组织存储和管理数据,使用tomcat服务器向外提供服务。使用该系统对外有利于提高企业的综合竞争力,对内有利于提高成本管理和控制的水平,简化了报价流程、提高了工作效率、精简了报价机构,降低了成本。研究和掌握必要的信息采集和数据查询技术,是各个企业,事业单位信息化的一个重要标志。当前大多数企业采取的报价方式仍然是用EXCEL表格和人工的方式,这不仅不利于大量数据的总结,更不利于对销售利润的控制。

m0_60918862的博客 999

【冷冻电镜】RELION5.0使用教程总结

对于您自己的数据,您可能希望使用各种倾斜系列对齐方法,然后比较每种方法生成的断层扫描图像的质量(参见下一步)。通过检查 CtfFind job 的 tilt_series 目录中的star文件来检查几个倾斜系列的散焦值。GitHub上也有人反应这个问题,目前我的解决方案是下载了较低版本的CTFFIND的,降级到4.1.10可以成功运行。此外,logfile.pdf 文件包含所有显微照片的有用参数图,例如散焦、像散、估计分辨率等,以及整个数据集中这些值的直方图。的目录,以及指向此目录的符号链接。

进阶中的程序员吃吃的博客 4227

安卓程序崩溃异常信息 SIGSEGV,产生的原因是因指针被截断,其中错误地址的前 32 位全部为零。

将 32 位代码移植到 64 位架构 如果您的代码已经可以在桌面或 iOS 平台上运行,那么您无需针对 Android 做额外的工作。如果这是第一次针对 64 位系统构建您的代码,那么您需要解决的主要问题是指针不再适合int这样的 32 位整数类型。您将需要更新以int、unsigned或uint32_t等类型存储指针的代码。在 Unix 系统上,long对应的是指针大小,但在 Windows 上并非如此,因此您应该改用释意类型uintptr_t或intptr_t。使用ptrdiff...

AppNinja 开发手记 2683

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5076

函数使用前未申明,导致返回值在64位系统被截断

我们写main函数时,可以直接写成mian();不用定义返回值,那是因为我们对返回值不关注,编译器会默认返回值类型为整型。 若我们关注返回值类型,一定要显性定义返回值类型。否则,编译器会使用默认返回值类型,出现非预想的结果。 例: int main() { int p = NULL; intq = NULL; p = (int *)malloc(sizeof(int)); if(NULL == p...

weixin_41660089的博客 1327

2.3 MMU Notifier(上):KVM 催生的页表变化通知

探讨了MMU Notifier机制的作用及其在虚拟化等场景中的应用。当CPU页表发生变更(如munmap、页面迁移等操作)时,需要通知拥有"第二套页表"的子系统(如KVM的EPT/NPT、IOMMU、GPU等)失效其映射。MMU Notifier通过订阅-通知机制实现这一功能,核心数据结构包括mmu_notifier订阅对象和回调接口mmu_notifier_ops。当CPU页表修改时,通过mmu_notifier_range描述变更范围,调用订阅者的回调函数进行同步,确保外部MMU与CPU页表一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 1032

AutoSAR系列讲解 - 资料下载

学习资料下载汇总

雪云飞星的博客 4万+

记录一个诡异的函数调用返回错误的指针bug

//main.c#include "test.h" void main(){ S* s = get_struct_s(); printf("%s\n",s->name); return 0; }//test.h typedef struct S_{ ... char name[8]; } S;S* s_array[10]; //test.c #inc...

popvip44的博客 533

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

关于64位机指针返回截短问题

看到没有64位的指针函数返回后尽然截断了:从 0x7f3bdc001990 变为 0xffffffffdc001990, 指针前32位被重置

天好蓝 4920

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

32位C程序在64位上使用遇到的问题记录

1.返回值是指针。 注意当函数的返回值是指针时,需要注意显示声明!如果隐式声明会被默认截断为32位数据,指针就会出问题,导致崩溃轻而易举。

more_HH 670

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

记一次CLTQ指令引起的函数返回值异常

问题如下:同一套代码分别编译出32位和64位程序;32位程序在运行正常,但是64位程序运行出现coredump。 问题分析:对64位程序的coredump文件进行分析。发现函数函数返回的指针被截断了。64位程序返回指针有两种情况,第一种,指针高32位全部填充0;第二种,指针高32位全部填充1,第二种情况很容易迷惑人,指针的地址怎么指向内核地址。 1. 对二进制文件进行反汇编,发现函数返回的指针...

myctime的博客 1078

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

函数未声明导致的错误

函数未声明导致的错误 对于一个合格的程序员来说,在进行函数调用前必须要对函数进行声明,应该是最基本的知识。而且现在的编译器都自带一定的代码检查功能,对于函数在调用前未声明的情况,在编译时都会提示告警信息,来提示开发人员相关的代码缺陷。 但通常在写测试代码时,程序员一般会比较随意,不一定会严格按照编程规范去写代码,因此经常会出现省略函数声明的操作,而在编译时,对编译器提示的告警信息也会忽略,这时候就会出现一种类型的bug。那就是函数返回指针时,指针的类型会被编译器设置成默认类型,也就是整型(integer)。

DSP小胖的博客 4740

移植64位发生的问题(跟cltq指令有关)

同事昨天在群里问了一个问题,大概将一个32位机器上运行良好的程序,移植到64位机器上之后出现了问题,看了一下core,大概是一个返回指针的函数,在函数内查看返回值还是正确的,但是到调用函数里面,返回值却被截掉了一段,引起了core。 具体代码如下: char *attach_shm(char *shmstr, int defaultkey, int shmsize) {     cha

愤怒的小鸡 1919

realloc函数在哪些情况下可能导致数据丢失?

realloc。

2509_93013226的博客 875

C语言隐式声明导致的死机问题

概述: 在一次开发工作中,同样代码同样的一个配置操作在32位平台正常运行,64位平台上会立马死机。编译也没有报任何错误和警告,查看代码也没有任何可疑之处,实在有些莫名。经过打印定位到死机位置是使用一个指针函数A返回的地址进行memcpy操作会立马死机,打印出指针地址,发现函数A内打印指针地址正常,而外部调用这个函数接收到的返回值指针地址高32位被截断了,所以使用该指针就会立马死机。 意外的解决: 在本项目中有一个同样类似的指针函数B,这个操作可以正常使用,对比发现,A函...

Dancer__Sky的博客 1511

【进阶】C语言易错概念理解

本文节选部分常见C语言陷阱与缺陷,适用于有C语言基础,使用C语言编程的人学习参考,减少代码编译中无法发现的错误,提升代码可靠性、可移植性,减少调试时间。

Electrical_IT的博客 405

visual studio 2022 动态分配数组在运行时报错

加上头文件#include <stdlib.h>

WordSiSi的博客 923

使用malloc申请的内存,引发了异常: 写入访问权限冲突。

的问题在于,int和void *的大小可能不相同,甚至不相同。例如,在现代64位机器上,指针为64位类型,而INT是32位类型,因此,编译器会错误地将。C90标准中规定:所有未宣布的函数都被隐式地声明为返回INT并采用未指定的未指定参数。Windows下,x64位环境中,使用malloc申请的内存。当对申请的内存的操作的时候,会弹出“引发了异常: 写入访问权限冲突。(4 字节)处理,导致指针值被截断或符号扩展,最终得到一个无效的内存地址(如。的返回值(8 字节指针)当作。是典型的无效地址)。

369

常见gcc编译警告汇总

gcc编译警告总结

houxiaoni01的博客 6495

命令行登录mysql报Segmentation fault故障解决

对mysql8.0.21源码进行make,在链接时遇到错误,少了ncurses库,后来就装了该库,再次make成功。于是将mysqld启动,再用mysql -u root -p连接,输好密码回车后mysql客户端发生Segmentation fault。

linhao19841211_2的专栏 4036

python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法

2015年8月20日 16:57:11      又为一个问题浪费了两天的时间:      问题描述如下:染色日志库通过ctype导入,在64位的linux系统中只有主线程能正常使用,子线程创建日志对象并使用都会出错,报段错误。      问题的最终原因:64位的地址被python向int转换发生截断。           class my_void_p(c_void_p):    

jince007的专栏 4565
上一篇: DVR常见问题汇总
下一篇: dwceqos网络驱动性能优化
norlan_jame
博客等级 码龄16年 4567粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值