首页 > 系统相关 >x64平台下采用malloc申请的内存,用memset清零时报错???????

x64平台下采用malloc申请的内存,用memset清零时报错???????

时间:2023-01-31 11:24:28浏览次数:41  
标签:10 malloc double memset x64 报错 清零

问题详述

如下示例代码,在x86平台下可以正常运行,改成x64平台报错;(double类型同样会报错)

#include <stdio.h>
#include <string.h>
int main() {
	double b[10];
	memset((void*)b, 0, 10 * sizeof(double));
	for (char i = 0; i < 10; i++) printf("%f\n", b[i]);

	double* a = (double*)malloc(10 * sizeof(double));
	for (int i = 0; i < 10; i++) printf("%d--%p--%p\n", i, a + i, b + i);
	memset((void*)a, 0, 10 * sizeof(double));
	for (char i = 0; i < 10; i++) printf("%f\n", a[i]);

	free(a);

	return 0;
}

在x64平台下,数组b可以正常memset清零,但是使用malloc申请内存的数组a在memset清零时会报错,具体错误如下:
image

我们输出了两个数组的地址,如下图:
image

可以发现,发生访问冲突的地址是数组a的第三个元素。

在x86平台下正常运行的结果如下:
image

问题分析

对比x86下数组地址,和对比x64两种数组地址,发现大概率是地址问题,报错地址高位是F,正常没有报错地址高位为0;
然后去查找memset源码发现:

void *(memset) (void *s,int c,size_t n)
{
    const unsigned char uc = c;
    unsigned char *su;
    for(su = s;0 < n;++su,--n)
        *su = uc;
    return s;
}

memset源码将 (void*) 类型的指针 转换成 (unsigned char*)类型的指针,问题出现在 *su 取值这里。

然后我单独去测 取值符号* 在x64平台下也会报相同的错误。大概率就是它惹的祸。大概率地址越界了

猜测原因

根据上面发现的问题,猜测是由于 x64平台下,malloc申请的空间越界,导致寻址报错。

弱智错误

错误原因:没有引用malloc的头文件 stdlib.h ,编译器为什么没有报错(猜测应该是别的地方有malloc的错误是实现)

标签:10,malloc,double,memset,x64,报错,清零
From: https://www.cnblogs.com/zjacky/p/17075676.html

相关文章

  • C-指针参数不能直接malloc
    函数的指针参数不能直接使用malloc,直接malloc指针还是NULL。举例:voidtest_func(char*p,intnum){ p=(char*)malloc(num);}当调用test_func给p分配内存时就会失......
  • malloc()函数
    1、malloc()函数malloc()函数的头文件是stdlib.h,其函数声明如下:void*malloc(size_tsize);其中参数size_tsize表示动态内存分配空间的大小,以字节为单位。size_t是ty......
  • new和delete与malloc和free的区别
    new和delete与malloc和free的区别总结重要区别1、malloc和free是C语言的标准库函数;new和delete是C++中的操作运算符。以上两种方式均可以实现对象在堆中分配空间和回收,那......
  • CSAPP MallocLab 笔记
    CSAPPMallocLab笔记CS15-213labnotessbrk函数为了实现动态的内存分配,一个核心的函数就是sbrk。memoryalignment8字节对齐的地址特征,其地址数值的16进制表......
  • linux 内存管理(四)malloc--mmap--brk
    用strace分析malloc内存申请过程。长话短说,申请内存空间一般就两种方法,一种是malloc,另一种是mmap映射空间。 在使用malloc()分配内存的时候,可能系统调用brk(),也可能调用m......
  • malloc() , calloc()
    Thereisabriefintroductiontobothfunctions:Ifaprogrammerwanttoallocateablockofmemories,theymustrequirethepermissionofOSthenhaveitallo......
  • 通用内存分配库tcmalloc的实现
    tcmallocTCMalloc是Google开发的内存分配器,在不少项目中都有使用,例如在Golang中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、......
  • 短说通用版3.8.1正式版发布|积分清零、排行榜、全新表情包等功能
    Hi大家好,我是给你们带来惊喜的运营小番茄。本期会大家汇报一下短说最新进程:短说通用版3.8.1正式版,是上次发文3.8.0测试版的正式版。本次3.8版本更新大量功能,主要围绕大家心......
  • 【C语言】malloc 函数
    那么这篇文章来介绍下动态内存开辟的函数之malloc()的使用,知道如何用了,那么就相当于学会了这个动态内存开辟。  ......
  • malloc()与calloc区别
    1.分配内存空间函数malloc调用形式:(类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。“......