malloc为不同的数组分配相同的地址

时间:2014-05-16 12:47:53

标签: c++ memory-management

我尝试按如下方式初始化一些数组:

unsigned int t(sizeX*sizeY*sizeZ);
m_data = (double*) malloc(t*sizeof(double));
m_func = (double*) malloc(t*sizeof(double));
m_tmp = (double*) malloc(t*sizeof(double));

然而,在某些时候,当检查数组元素的地址时,它们是一致的,所以元素是相同的(我在第二个重叠之前得到第一个数组的前半部分)。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

实际上我不知道你的t(...)做了什么,但当t是一个数字时,结果正是你所期望的,三个不同的记忆块'地址:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned int t = 2*3*4;
    double *m_data = malloc(t*sizeof(double));
    double *m_func = malloc(t*sizeof(double));
    double *m_tmp  = malloc(t*sizeof(double));

    printf("array1 pointer: %p\n"
           "array2 pointer: %p\n"
           "array3 pointer: %p\n", m_data, m_func, m_tmp);

    free(m_data);
    free(m_func);
    free(m_tmp);

    return 0;
}

<强> 输出:

array1 pointer: 0x7ff528c038c0
array2 pointer: 0x7ff528c03980
array3 pointer: 0x7ff528c03a40

答案 1 :(得分:1)

除了明显的语法错误(对于C),您的代码中存在两个主要问题

  1. 您的尺码计算可能会溢出,这就是为什么您总是应该使用size_t作为&#34;尺寸&#34;的类型,不仅适用于您的结果t,还适用于其他变量sizeX
  2. 您正在投掷malloc的回复。在C中,这可能意味着您正在使编译器因其错误消息而安静,而他并不知道malloc。如果是这样,您忘记包含正确的头文件。 (你遇到的错误是你的malloc地址首先转换为int然后再转换为指针类型。在64位平台上,这会丢失信息。)